原文:http://www.cnblogs.com/wanyuan8/archive/2011/11/09/2243483.html
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 @cou int
set @sql='select @count=count(*) from emp where id=@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的參數清單與外部提供參數的參數清單參數名可以同名