天天看點

sp_executesql介紹和使用

原文: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的參數清單與外部提供參數的參數清單參數名可以同名