这两天的项目中写了一个存储过程,用表名做变量的,涉及到动态Sql的一些东西,把自己走过的弯路记录一下,希望和我有同样经历的朋友少走些弯路。
首先如果用表名做变量,则必须使用动态sql,否则存储过程会报错。
如果要执行完动态Sql后得到返回值,则存放动态Sql的变量必须定义为nvarchar或ntext类型。我开始就是定义的varchar类型,结果连续报错。
要想从动态Sql中得到返回值,直接用下面的语句是不行的:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
declare @sql nvarchar(1000);
set @sql = 'select @currScore= score,@version = [version] from '
+ @scoreTable
+ ' where id=' + cast(@id as varchar(10))
+ ' and [type]=' + cast(@type as varchar(10))
exec @sql
必须使用下面的方式才可以:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
set @sql = N'select @currScore= score,@version = [version] from '
+ @scoreTable
+ ' where id=' + cast(@id as varchar(10))
+ ' and [type]=' + cast(@type as varchar(10))
exec sp_executesql @sql,N'@currScore int output,@version timestamp output',@currScore output,@version output
还有一点需要注意:一是动态Sql中整形变量都要转成字符型,这里我把整形的都转成字符型了。还有时间戳型变量先转换成bigint再转换成字符串