mssql:sp_executesql与exec(@sql)

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赫曦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值