日期:2014-05-18  浏览次数:20496 次

我写了个取自动编号的小函数,不知道哪里错了?
CREATE   FUNCTION   UDF_GetIncCode   (@TableName   varchar(20),@FieldName   varchar(20))
RETURNS
integer
AS
BEGIN
    /*取自动累加的序号*/
    declare   @sql   varchar(200),@Code   integer
   
    set   @sql   =   'select   @@Code   =   '   +   @FieldName   +   '   From   '   +   @TableName
    exec(@sql)
    set   @Code   =   IsNull(@Code,0)   +   1
   
    set   @sql   =   'Update   '   +   @TableName   +   '   set   '   +   @FieldName   +   '   =   '   +   cast(@Code   as   varchar)
    exec(@sql)
    return   @Code
END

我保存的时候提示说:在函数内不正确地使用了   'EXECUTE '。
请问我的函数哪里错了?应该怎样改正?请指点,谢谢!

------解决方案--------------------
函数里不支持动态sql的执行。建议改成存储过程。
------解决方案--------------------
--try

CREATE FUNCTION UDF_GetIncCode (@TableName varchar(20),@FieldName varchar(20))
RETURNS
integer
AS
BEGIN
/*取自动累加的序号*/
declare @sql nvarchar(2000),@Code integer

set @sql = 'select @Code = ' + @FieldName + ' From ' + @TableName
exec sp_executesql @sql, N '@Code int output ', @Code output
set @Code = IsNull(@Code,0) + 1

set @sql = 'Update ' + @TableName + ' set ' + @FieldName + ' = ' + cast(@Code as varchar)
exec(@sql)
return @Code
END

------解决方案--------------------
使用存储过程。
------解决方案--------------------
declare @Code int
exec SP_GetIncCode 'TIncCode ', 'SaleShipD ',@Code
select @Code as Code

咦?我这样写取回的结果为啥总是null呢?而数据库中的字段已经累加了

应该为这样:
declare @Code int
exec SP_GetIncCode 'TIncCode ', 'SaleShipD ',@Code output
select @Code as Code