1樓:匿名使用者
sql server的儲存過程是一個被命名的儲存在伺服器上的transacation-sql語句集合,是封裝重複性工作的一種方法,它支援使用者宣告的變數、條件執行和其他強大的程式設計功能。
儲存過程相對於其他的資料庫訪問方法有以下的優點:
(1)重複使用。儲存過程可以重複使用,從而可以減少資料庫開發人員的工作量。
(2)提高效能。儲存過程在建立的時候就進行了編譯,將來使用的時候不用再重新編譯。一般的sql語句每執行一次就需要編譯一次,所以使用儲存過程提高了效率。
(3)減少網路流量。儲存過程位於伺服器上,呼叫的時候只需要傳遞儲存過程的名稱以及引數就可以了,因此降低了網路傳輸的資料量。
(4)安全性。引數化的儲存過程可以防止sql注入式的攻擊,而且可以將grant、deny以及revoke許可權應用於儲存過程。
儲存過程一共分為了三類:使用者定義的儲存過程、擴充套件儲存過程以及系統儲存過程。
其中,使用者定義的儲存過程又分為transaction-sql和clr兩種型別。
transaction-sql 儲存過程是指儲存的transaction-sql語句集合,可以接受和返回使用者提供的引數。
clr儲存過程是指對.net framework公共語言執行時(clr)方法的引用,可以接受和返回使用者提供的引數。他們在.
net framework程式集中是作為類的公共靜態方法實現的。(本文就不作介紹了)
建立儲存過程的語句如下:
create [schema_name.] procedure_name [ ; number ]
[ [ varying ] [ = default ] [ [ out [ put ]
] [ ,n ]
[ with [ ,n ]
[ for replication ]
as [;]
::=[ encryption ]
[ recompile ]
[ execute_as_clause ]
::=::=external name assembly_name.class_name.method_name
[schema_name]: 代表的是儲存過程所屬的架構的名稱
例如:create schema yangyang8848
gocreate proc yangyang8848.allgoods
as select * from master_goods
go執行:exec allgoods 發生錯誤。
執行:exec yangyang8848.allgoods 正確執行。
[;number]: 用於對同名過程進行分組的可選整數。使用一個 drop procedure 語句可將這些分組過程一起刪除。
例如:create proc s1 ;1
asselect * from master_goods
gocreate proc s1 ;2
as select * from master_location
go建立完畢了兩個儲存過程。它們在同一個組s1裡,如果執行exec s1 則儲存過程預設執行 exec s1 ;1 。如果我們想得到所有據點資訊則需要執行exec s1 ;2。
當我們要刪除儲存過程的時候,只能執行drop exec s1 則該組內所有的儲存過程被刪除。
[@ parameter]: 儲存過程中的引數,除非將引數定義的時候有預設值或者將引數設定為等於另一個引數,否則使用者必須在呼叫儲存過程的時候為引數賦值。
儲存過程最多有2100個引數。
例如:create proc yangyang8848.onegoods
@goodscode varchar(10)
as select * from master_goods where goodscode = @goodscode
go呼叫的**:
declare @code varchar(10)
set @code = '0004'
exec yangyang8848.onegoods @code
在引數的後邊加入output 表明該引數為輸出引數。
create proc yangyang8848.onegoods
@goodscode2 varchar(10) output,@goodscode varchar(10) = '0011'
as select * from master_goods where goodscode = @goodscode
set @goodscode2 = '0005'
go呼叫方法:
declare @vv2 varchar(10)
exec yangyang8848.onegoods @code out
注意:如果儲存過程的兩個引數一個有預設值一個沒有,那麼我們要把有預設值得放在後邊,不然會出問題哦~~
細心的朋友,可能看到上邊的語句有一些不同,比如,儲存過程用的是output,而呼叫語句用的是out。我要告訴您,兩者是一樣的。
[recompile]:指示資料庫引擎 不快取該過程的計劃,該過程在執行時編譯。如果指定了 for replication,則不能使用此選項。
對於 clr 儲存過程,不能指定 recompile。
這個說一個非常好用的函式 object_id :返回架構範圍內物件的資料庫物件標識號。
例如:我們建立儲存過程時,可以如下寫**
if object_id('yangyang8848.onegoods') is not null
drop proc yangyang8848.onegoods
gocreate proc yangyang8848.onegoods
@goodscode2 varchar(10) out,@goodscode varchar(10) = '0011'
as select * from master_goods where goodscode = @goodscode
set @goodscode2 = '0005'
go針對於上邊的這個儲存過程,我們呼叫以下sql查詢
select definition from sys.sql_modules
where object_id = object_id('yangyang8848.onegoods');
我們是可以查到結果的。
可是如果我們對該儲存過程加入[ encryption ] 那麼你將無法看到任何結果 然後我們查詢 sys.sql_modules 目錄檢視,將返回給你null。
if object_id('yangyang8848.onegoods') is not null
drop proc yangyang8848.onegoods
gocreate proc yangyang8848.onegoods
@goodscode2 varchar(10) out,@goodscode varchar(10) = '0011'
with encryption
as select * from master_goods where goodscode = @goodscode
set @goodscode2 = '0005'
go然後我們執行以下sql: exec sp_helptext 'yangyang8848.onegoods'
你將得到以下結果:the text for object 'yangyang8848.onegoods' is encrypted.
說到這裡你應該明白了,引數[ encryption ]:是一種加密的功能, 將 create procedure 語句的原始文字轉換為模糊格式。模糊**的輸出在 sql server 2005 的任何目錄檢視中都不能直接顯示。
對系統表或資料庫檔案沒有訪問許可權的使用者不能檢索模糊文字。但是,可通過 dac 埠訪問系統表的特權使用者或直接訪問資料庫檔案的特權使用者可使用此文字。此外,能夠向伺服器程序附加偵錯程式的使用者可在執行時從記憶體中檢索已解密的過程。
前兩天寫了一篇關於遊標的介紹文章 ,下邊寫一個例子,將遊標與儲存過程一起使用上:
if object_id('dbo.getmastergoods') is not null
drop proc dbo.getmastergoods
gocreate proc getmastergoods
@mycursor cursor varying output
with encryption
as set @mycursor = cursor
forselect goodscode,goodsname from master_goods
open @mycursor
go--下邊建立另外一個儲存過程,用於遍歷遊標輸出結果
create proc getallgoodsidandname
asdeclare @goodscode varchar(18)
declare @goodsname nvarchar(20)
declare @mastergoodscursor cursor
exec getmastergoods @mastergoodscursor out
fetch next from @mastergoodscursor
into @goodscode,@goodsname
while(@@fetch_status = 0)
begin
begin
print @goodscode + ':' + @goodsname
endfetch next from @mastergoodscursor
into @goodscode,@goodsname
endclose @mastergoodscursor
deallocate @mastergoodscursor
go最後執行exec getallgoodsidandname結果為以下內容
0003:品0003
0004:品0004
0005:123123
0006:品0006
0007:品0007
0008:品0008
0009:品0009
0010:品0010
0011:品0011
0012:品0012
0013:品0013
0014:品0014
資料結構c語言描述線性表實驗,資料結構(C語言描述) 線性表實驗
include include define list init size 100 define listincrement 10 typedef structsqlist sqlist sq void initlist sq sqlist sq 初始化列表 void getelem sqlist ...
c語言資料結構中鏈棧的問題,C語言資料結構中鏈棧的問題
這個鏈棧應該bai就是一個du 用連結串列弄的後進先出的 zhi棧結構dao。top指標永遠指向棧的最上面的回那個節點。這個函式是新加一個節點到這個棧中,首先分配了空間給s,s是要新加入這個棧的那個節點。s next top 就是讓s指向棧的最上面的那個元素。top s 因為現在最上面的節點是s了,...
資料結構C語言版迷宮問題,資料結構C語言版迷宮問題
剛學都這樣,想當初我學習的時候連一個單連結串列的逆置,都要理解半天。程式設計就是把實際問題給抽象成數學或非數學模型,結合資料的表示,再找到解決的方法。別忘了,學習資料結構是為了更好的運算元據。思路 首先,迷宮如何用計算機語言表示?一般用二維陣列。0表示牆,1表示路。其次,其次就是如何從迷宮中走出來了...