我创建一个函数,内容如下,
老是报错:必须声明变量@sql,请问错在哪里?
CREATE FUNCTION dbo.get_seq
(@seq_table_name nvarchar)  
RETURNS numeric(18) AS  
BEGIN 
declare @seq_no numeric(18)
declare @sql nvarchar(200) @sql='insert into ' + @seq_table_name + '(null_col) values(null)'
exec (@sql) @sql='set @seq_no=(select max(seq_no) from ' + @seq_table_name + ')'
exec (@sql)
        
RETURN(@seq_no)
END

解决方案 »

  1.   

    自定义函数内部不能使用execute执行动态SQL语句,改用存储过程吧。
      

  2.   

    函数内部不能使用动态SQL,这是限制。
      

  3.   

    CREATE FUNCTION dbo.get_seq
    (@seq_table_name nvarchar)  
    RETURNS numeric(18) AS  
    BEGIN 
    declare @seq_no numeric(18)
    declare @sql nvarchar(200)--这里价格select给@sql赋值
    select @sql='insert into ' + @seq_table_name + '(null_col) values(null)'
    exec (@sql)
    --这里也是
    select @sql='set @seq_no=(select max(seq_no) from ' + @seq_table_name + ')'
    exec (@sql)
            
    RETURN(@seq_no)
    END
      

  4.   

    記得函數語句內部是不能運行exec 語句的
      

  5.   

    函数内部不能使用exec昨天试了好久才发现
      

  6.   

    不用变量表名了,改成这样还是不行,说insert有错误:
    CREATE FUNCTION dbo.get_seq_unit()
    RETURNS numeric(18) AS  
    BEGIN 
    declare @seq_no numeric(18) insert into seq_unit(null_col) values (null) set @seq_no=(select max(seq_no) from seq_unit) RETURN(@seq_no)END
      

  7.   

    函数里面的insert,update,delete只能针对表变量,而不能针对表对象.
      

  8.   

    ----创建存储过程
    create proc dbo.sp_GetSeqUnit
    as
    declare @seq_no numeric(18)
    insert into seq_unit(null_col) values (null)
    select @seq_no = max(seq_no) from seq_unit
    RETURN(@seq_no)
    go
    ----执行存储过程,获得返回值
    declare @seq_no numeric(18)
    exec @seq_no = dbo.sp_GetSeqUnit
    select @seq_no
      

  9.   

    那换成存储过程里,表明能否用变量名呢?
    ----------------------------------------------------------------------------------
    这个变量名是指表变量,而不是表名称字符串变量.如果是后者,必须使用动态SQL.
      

  10.   

    我把存储过程改成如下:
    执行起来总是报错:必须声明标量变量@seq_no
    CREATE proc dbo.sp_GetSeq
    (@seq_name  [nvarchar](30)
    ,@seq_no numeric(18) output
    )
    as
    declare @sql nvarchar(200)

     set @sql='insert into ' + @seq_name + '(null_col) values(null)'
    exec (@sql)

    set @sql='set @seq_no=(select max(seq_no) from ' + @seq_name + ')'
    exec (@sql)GO
      

  11.   

    CREATE proc dbo.sp_GetSeq
    (@seq_name  [nvarchar](30)
    ,@seq_no numeric(18) output
    )
    as
    declare @sql nvarchar(200)

     set @sql='insert into ' + @seq_name + '(null_col) values(null)'
    exec (@sql)

    set @sql=N'set @seq_no=(select max(seq_no) from ' + @seq_name + ')' exec sp_executesql @sql,N'@seq_no numeric(18) output',@seq_no output
    GO
      

  12.   

    seq_no是标志列吗?
    如果是,根本不用写这么复杂,用@@IDENTITY就可以如果是在触发器改的seq_no值,就只能这样了