天天看點

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