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的引數列表與外部提供引數的引數列表引數名可以同名
儲存過程動態引數
create or replace procedure testdynamicparams p cmbno in varchar2,p trade date in varchar2 is cursor testcursor is select cmbno,trade date,securno,tur...
儲存過程動態配置
using system using system.text.regularexpressions using system.web using system.reflection using system.configuration using system.xml using system.xm...
oracle 動態儲存過程
1.定時 begin sys.dbms scheduler.create job job name job pro his delete cp job type stored procedure job action pro his delete cp start date sysdate,repe...