if
(exists
(select
*from sys.objects where name =
'pro_name'))
drop
proc pro_name
gocreate
proc pro_name
@param_name param_type [
=default_value]
asbegin
sql語句
end
ps:表示非必寫內容。sys.objects儲存的是本資料庫中的資訊,不僅僅儲存表名,還有儲存過程名 、檢視名、觸發器等等。
例如:
1if(
exists
(select
*from sys.objects where name =
'usp_getalluser'))
2drop
proc usp_getalluser
3 go
4create
proc usp_getalluser
5@userid
int=16
as7set nocount on;8
begin
9select
*from userinfo where id=
@userid
10end
ps:sql server 實用工具將 go 解釋為應將當前的 transact-sql 批處理語句傳送給 sql server 的訊號。當前批處理語句是自上一 go 命令後輸入的所有語句,若是第一條 go 命令,則是從特殊會話或指令碼的開始處到這條 go 命令之間的所有語句。
exec dbo.usp_getalluser 2
;
ps:一般在執行儲存過程是,最好加上架構名稱,例如 dbo.usp_getalluser 這樣可以可以減少不必要的系統開銷,提高效能。 因為如果在儲存過程名稱前面沒有加上架構名稱,sql server 首先會從當前資料庫sys schema(系統架構)開始查詢,如果沒有找到,則會去其它schema查詢,最後在dbo架構(系統管理員架構)裡面查詢。
依次展開資料庫、可程式設計性、儲存過程,即可看到已建立的儲存過程。
alter
proc proc_name
assql語句
1if(
exists
(select
*from sys.objects where name=
'getuser'))
2drop
proc getuser
3 go
4create
proc getuser
5@id
int output,
6@name
varchar(20
)out7as
8begin
9select
@id=id,
@name
=name from userinfo where id=
@id10
end11 s
12 go
13declare
14@name
varchar(20
),15@id
int;
16set
@id=3;
17exec dbo.getuser @id
,@name
out;
18select
@id,
@name;19
print cast(
@idas
varchar(10
))+'-'
+@name
;
ps:引數output為該引數可以輸出
1if(
exists
(select
*from sys.objects where name=
'getuserbypage'))
2drop
proc getuserbypage
3 go
4create
proc getuserbypage
5@pageindex
int,
6@pagesize
int7as8
declare
9@startindex
int,
10@endindex
int;
11set
@startindex=(
@pageindex-1
)*@pagesize+1
;12set@endindex
=@startindex
+@pagesize-1
;13begin
14select id,name from15(
16select
*,row_number(
)over
(order
by id)
as number from userinfo
17)t where t.number>=
@startindex
and t.number<=
@endindex
18end
1920 go
21exec dbo.getuserbypage 2,4
;
if
(exists
(select
*from sys.objects where name=
'jayjaytotest'))
drop
proc jayjaytotest
go create
proc jayjaytotest
@givemoney
int,
@username nvarchar(20)
as beginset nocount on
;begin
tran
;begin try
update banktest set money = money-
@givemoney
where name=
@username
;update banktest set money = money+
@givemoney
where name=
'test'
;commit
;end try
begin catch
rollback
tran
;print
('發生異常,事務進行回滾');
end catch
endgo
exec jayjaytotest 10
,'jayjay
select
*from sys.
[syscacheobjects]檢視當前快取的執行計畫
如果執行儲存過程時成功通過解析階段,則 microsoft sql server 查詢優化器將分析儲存過程中的 transact-sql 語句並建立乙個執行計畫。執行計畫描述執行儲存過程的最快方法,所依據的資訊包括:
1.表中的資料量。
2.表的索引的存在及特徵,以及資料在索引列中的分布。
3.where 子句條件所使用的比較運算子和比較值。
4.是否存在聯接以及 union、group by 和 order by 關鍵字。
查詢優化器在分析完儲存過程中的這些因素後,將執行計畫置於記憶體中。分析儲存過程和建立執行計畫的過程稱為編譯。優化的記憶體中的執行計畫將用來執行該查詢。執行計畫將駐留在記憶體中,直到重新啟動 sql server 或其他物件需要儲存空間時為止。如果隨後執行了儲存過程,而現有執行計畫仍留在記憶體中,則 sql server 將重用現有執行計畫。如果執行計畫不再位於記憶體中,則建立新的執行計畫。
重新編譯執行計畫(create proc jayjaytotest with recompile)
建立儲存過程時在其定義中指定 with recompile 選項,表明 sql server 將不對該儲存過程計畫進行快取記憶體;該儲存過程將在每次執行時都重新編譯。當儲存過程的引數值在各次執行間都有較大差異,導致每次均需建立不同的執行計畫時,可使用 with recompile 選項。此選項並不常用,因為每次執行儲存過程時都必須對其進行重新編譯,這樣會使儲存過程的執行變慢。
由於資料庫的新狀態,資料庫內的某些更改可能會導致執行計畫效率低下或不再有效。sql server 檢測這些使執行計畫無效的更改,並將計畫標記為無效。此後,必須為執行查詢的下乙個連線重新編譯新的計畫。導致計畫無效的情況包括:
1.對查詢所引用的表或檢視進行任何結構更改(alter table 和 alter view)。
2.通過語句(如 update statistics)顯式生成或者自動生成新的分發內容統計。
3.除去執行計畫所使用的索引。
4.顯式呼叫 sp_recompile。
5.對鍵的大量更改(其他使用者對由查詢引用的表使用 insert 或 delete 語句所產生的修改)。
6.對於帶觸發器的表,inserted 或 deleted 表內的行數顯著增長。
SQLServer 建立儲存過程範例
use 資料庫名稱 goset ansi nulls on goset quoted identifier on gocreate procedure dbo 儲存過程名稱 引數名稱1 char 20 引數名稱2 資料型別 長度 as begin 定義變數 declare 變數名稱 資料型別 長度 ...
SQL Server 建立分頁儲存過程
sql server 建立分頁儲存過程 分頁儲存過程 建立 create proc usp pagescore page int,頁數 count int,條數 sumpage int output 總頁數as begin 獲取總頁數,ceiling表示向上取整 set sumpage ceilin...
二十 Sql server儲存過程的建立
在這一節,我 們要學習sql server 的核心部分儲存過程 儲存過程 stored procedure 是一組為了完成特定功能的sql語句集,經編譯後儲存在資料庫中。使用者通過指定儲存過程的名字並給出引數來執行它。儲存過程是資料庫中非常重要的乙個物件,它在實際用途中非常廣泛。儲存過程具有執行速度...