create function 先修课(@s int)
returns table
as
begin
return (select 学生表.学号,姓名,先修课 from 学生表,成绩表,课程表
where 学生表.学号=成绩表.学号 and 成绩表.课程号=课程表.课程号 and 学号=@s )
end
报错:
服务器: 消息 170,级别 15,状态 31,过程 先修课,行 7
第 7 行: 'BEGIN' 附近有语法错误。
请问是什么原因,如果把begin和end去掉,它也报错:
服务器: 消息 209,级别 16,状态 1,过程 先修课,行 5
列名 '学号' 不明确。
问题:1、为什么加begin end就报错?
      2、学号为什么不能是变量?谢谢大家了,请帮我解答……

解决方案 »

  1.   

    create function 先修课(@s int)
    returns table
    as
    begin
     declare @i nvarchar(2000)
      set @i=(select 学生表.学号,姓名,先修课 from 学生表,成绩表,课程表
    where 学生表.学号=成绩表.学号 and 成绩表.课程号=课程表.课程号 and 学号=@s ) 
       return @i
    end
      

  2.   

    不行啊,还是begin报错,去掉就declare报错
      

  3.   

    create function 先修课(@s int)
    returns table
    as 
    return select 学生表.学号,姓名,先修课 from 学生表,成绩表,课程表
    where 学生表.学号=成绩表.学号 and 成绩表.课程号=课程表.课程号 and 学号=@s 
      

  4.   

    这是语法问题..T-SQL联机丛书查CREATE FUNCTION当创建内联表值函数时,不用加BEGIN..END,而直接RETURN
    如:
    CREATE FUNCTION fn_name
        RETURNS TABLE
    AS
       RETURN(
           sql_query;
       )当创建多语句的表值函数时,需要加BEGIN..END.
    如:
    CREATE FUNCTION fn_name
        RETURN @t TABLE(col1 col1_type,col2 col2_type)
    AS
    BEGIN
        INSERT INTO @t
            SELECT col1,col2
            FROM tb_name    RETURN
    END创建标量函数就不用说了..