sp_executesql介绍和使用

execute相信大家都用的用熟了,简写为exec,除了用来执行存储过程,一般都用来执行动态Sql
sp_executesql,sql2005中引入的新的系统存储过程,也是用来处理动态sql的, 如:
exec sp_executesql @sql, N'@count int out,@id varchar(20)', @cou out
,@id
@sql为拼成的动态sql
N'@count int out,@id varchar(20)'为拼成的动态sql内的参数列表
@cou out,@id为为动态sql内参数列表提供值的外部参数列表

那么它们之间有什么区别呢?

1,它们之间最大的区别是嵌入式的参数,如下面一个语句
declare @sql nvarchar(2000)
declare @id varchar(20)
set @id='1'
set @sql='select count(*) from emp where id=' + @id
exec @sql

我想把得到的count(*)传出来,用传统的exec是不好办到的,但是用sp_executesql则很容易就办到了:
declare @sql nvarchar(2000)
declare @cou int
declare @id varchar(20)
set @id='1'
set @sql='select @count=count(*) from emp where id=@id'
exec sp_executesql @sql, N'@count int out,@id varchar(20)', @cou out
,@id
print @cou

2.性能
可以看到,如果用exec,由于每次传入的@id不一样,所以每次生成的@sql就不一样,这样每执行一次Sql2005就必须重新将要执行的动态Sql重新编译一次
但是sp_executesql则不一样,由于将数值参数化,要执行的动态Sql永远不会变化,只是传入的参数的值在变化,那每次执行的时候就秒用重新编译,速度自然快多了哈!

注意:
1.sp_executesql要求动态Sql和动态Sql参数列表必须是Nvarchar,比如上个例子的@sql,N'@count int out,@id varchar(20)'我记得在sql2005中Varchar也可以的,但是我打了Sp3补丁后就不行了,必须为Nvarchar

2.动态Sql的参数列表与外部提供值的参数列表顺序必需一致,如:
N'@count int out,@id varchar(20)', @cou out,@id

@count 对应 @cou,@id对应@id
如果不一致,必须显式标明,如:
N'@count int out,@id varchar(20)', @id=@id, @count=@cou out
3.动态SQl的参数列表与外部提供参数的参数列表参数名可以同名

 

sq_executesql的另一个与其接口有关的强大功能是,你可以使用输出参数为调用批处理中的 变量返回值。
利用该功能可以避免用临时表返回数据,从而得到更高效的代码和更少的重新编译。定义和使用输出参数的语法与存储过程类似。
也就是说,你需要在声明参数时指定OUTPUT子句。
例如,下面的静态代码简单的演示了如何从动态批处理中利用输出参数@p把值返回到外部批处理中的变量@i. 
DECLARE @sql AS NVARCHAR(12),@i AS INT;
SET @sql = N' SET @p = 10';
EXEC sp_executesql      @stmt = @sql,      @params = N'@p AS INT OUTPUT',
 @p = @i OUTPUT
SELECT @i  该代码返回输出10

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值