今天遇到一个问题,需要在存储过程中执行一段sql字符串,并且需要给存储过程的变量赋值。
开始写的代码如下:
create proc PROC_test
@tablename varchar(20),
@userName varchar(10) output
as
delcare @baseSql varchar(8000)
set @baseSql='select @userName=name from '+@tablename
@tablename varchar(20),
@userName varchar(10) output
as
delcare @baseSql varchar(8000)
set @baseSql='select @userName=name from '+@tablename
exec(@baseSql)
print @userName
print @userName
上面代码就会报错:必须声明标量变量 "@typeName,原因是exec 执行的字符串是一个单独的整体, @userName并没有在字符串中定义。后来在以前的存储过程中找到了解决方法,利用系统自带的拓展存储过程 sp_executesql可以解决需求,sp_executesql @Sql,N'@userName varchar(80) OUTPUT',@userName OUTPUT -- 参数:1、sql语句;2、定义输出参数;3、接收输出参数
正确的代码如下:
正确的代码如下:
create proc PROC_test
as
declare @baseSql nvarchar(4000)--类型为ntext/nchar/nvarchar 的参数
,@userName varchar(80)
set @baseSql='select top 1 @userName=typeName from T_Ent_Type'
EXEC sp_executesql @baseSql,N'@userName varchar(80) OUTPUT',@userName OUTPUT -- 参数:1、sql语句;2、定义输出参数;3、接收输出参数
print @userName