sp_executesql
位于master库下的一个扩展存储过程。用于执行一段sql代码。
例子:
declare @count int,@tableName varchar(50)
,@SQLString nvarchar(max)
,@proid int
,@id int
,@ParmDefinition nvarchar(max)
,@msg varchar(50)
set @tableName='he';
set @proid=887;
set @id=159;
set @msg='';
set @SQLString=N'select @countOUT=@proid1+1,@msg= @tableName+''llo''';
set @ParmDefinition=N'@proid1 int,@countOUT int output,@msg varchar(50) output,@tableName varchar(50)';
exec sp_executesql @SQLString,@ParmDefinition,@proid1=@proid,@countOUT=@count output,@msg=@msg output,@tableName=@tableName;
select @count,@msg;
@sqlstring :就是你要执行的sql语句字符串,一定要声明为nvarchar类型,最大长度为4000个字符。
@ParmDefinition: @sqlstring里边用到的参数在这里声明,输出的参数要加output
最后的参数加output的参数是输出的参数(需要和外部的相对应的变量建立关联)
中间的参数就是@sqlstring 里边用到的参数(需要和外部的相对应的变量建立关联)
最后你可以 select 输出的参数 来查询
注意:output变量并不是返回值,而是需要事先定义好再传进去,类似c#中的ref。
exec(@sql)
可以执行普通给的sql和拼接的sql语句,但不能将@sql的执行结果赋值给外部变量。
例子:
Exec('select* from tableName')
例子2:
declare @fname varchar(20)
set @fname = 'FiledName'
Exec('select ' + @fname + ' fromtableName')
优点:exec所执行的字符串是varchar类型,它的最大长度可以达到8000.
exec(@sql) 什么时候比sp_executesql好用?
答案:当执行结果不需要赋值给外部变量,且执行的字符串长度大于4000.
sp_executesql执行的@sql语句必须是nvarchar,而nvarchar最大长度是4000,超长则造成字符串截断,此时如果采用exce()则可以执行varchar类型,长度可达8000.
我们可以采取字符串拼接的方式,将外部变量中的值传入@sql,例如:
Declare @分数 int=97
@sql='
select 姓名 from studenta
join score b ona. ID =b. ID
where b.score='''+@分数+'''
'
Exec(@sql)