您的位置:首页 > 数据库

mssql:sp_executesql与exec(@sql)

2015-08-02 22:21 375 查看

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')

Exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N

例子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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: