sql server 2008学习10 存储过程
輸入輸出參數:
給存儲過程傳參數,叫做輸入參數,用戶告訴存儲過程需要 利用這個參數干些什么.
輸出參數: 從存儲過程得到那些數據.
?
創建一個可選參數的存儲過程:
?
create proc pa1
@name varchar(50)=NULL
as
if(@name is not null)select * from a where name like @name+'%';
elseselect * from a exec pa1?
exec pa1 a
?
創建輸出參數:
使用輸出參數 傳遞 最后一次插入的標識列的值:
?
create proc pa2@id int output
asinsert into a(name) values('5')
set @id=@@identity 執行這個存儲過程:
declare @id int
exec pa2 @id out
print @id 結果如下:
?
返回值:
創建有返回值的存儲過程: create proc pa5
as
declare @mess varchar(50)
set @mess='exit'
print @mess;
return; 執行:
declare @result varchar(50)
exec @result=pa5
select @result 結果:
?
?
錯誤處理:
可以使用 @@error
?
use test
goif exists(select * from sysobjects where name='pa6')
drop proc pa6
go
create proc pa6
@name nvarchar(50),
@ss int
as
declare @error int
insert into b values(@name,@ss);set @error=@@errorif @error=0print 'new record is inserted' ;elsebeginif @error=547print 'at least one provided parameter was not found,correct an retry';elseprint ' unknown error occurred'end 下面使用try/catch
什么是 內聯錯誤: 那些能讓sql server 繼續運行,但是因為某種原因而不能 成功完成指定任務的錯誤.
?
手動引發錯誤:
raiserror(message_ID,級別,state)
可以查看 sql server 提供的所有錯誤消息: select * from master.sys.messages
?
存儲過程的優點:
- 可復用
- 安全性.可以創建一個返回結果集的存儲過程而不用賦予用戶訪問底層數據表的權限.???
存儲過程和性能
下面看一下存儲過程是如何工作的:
首先運行 create proc過程,這回解析查詢 以確保會實際運行這些代碼.它與 直接運行腳本的區別在于:
create proc可以利用所謂的 延遲對象解析. 可以忽略一些對象還不存在的實施,這就可以稍后創建這些對象.
在創建存儲過程之后,它將等待第一次執行.在那時,存儲過程唄優化,而查詢計劃被 編譯并且 緩存到系統上.
后續幾次運行此過程時,除非使用 with recompile選項指定,否則都會使用緩存的查詢計劃. 意味著每次使用存儲過程
時,存儲過程都會跳過很多優化和編譯工作.
如果想 在每次執行存儲過程時都自動重新編譯,那么可以這樣做:
create proc pa1
with recompile --這句可以實現
as
select * from a ?
遞歸:
計算階乘
create proc aa
@vin int,
@vout int out
as
declare @inv int
declare @outv intif @vin !=1beginselect @inv=@vin-1;exec aa @inv,@outv out;select @vout=@vin*@outv;endelsebeginselect @vout=1;end return ;go ?
執行此過程:
declare @inv int;declare @outv int;set @inv=5;exec aa @inv,@outv out;print cast(@outv as varchar(30)) 結果:
轉載于:https://www.cnblogs.com/soundcode/archive/2012/09/11/2680002.html
總結
以上是生活随笔為你收集整理的sql server 2008学习10 存储过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 4天升满级穆图
- 下一篇: AJAX跨域访问解决方案