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和e看不太清楚 資料結構問題 什麼是有向圖和無向圖?有向圖在圖中的邊是有方向的,表現出來就是有個箭頭指示方向,節點只能單向通訊或傳遞訊息,相當於單行道,無向圖邊沒方向是雙向的,邊連線的兩個節點有通路可以雙向通訊,類似於雙行道 有向圖就是任意兩個鄰接點之間只有一...
資料結構快速排序問題,C語言資料結構 快速排序的問題
由於你傳遞的l是值傳遞,在快速排序內部出現了一個名字一樣的區域性變數,只是區域性變數被排序了,並不是傳入的變數被排序,可以採用傳地址的方式解決,或者不定義形參,直接採用全域性變數。我使用前者幫你實現了 再者,快速排序 有點問題,幫你修改了下 include include define maxsiz...
資料結構出錯,很簡單。關於elemtype怎麼用的
elemtype在vc中沒有這種型別,所以在使用它之前對其定義如 typedef int elemtype將elemtype定義為整型的資料型別 elemtype必須是具體的數值型別,比如int,double.書上的一般是偽碼,不能直接當程式執行的 資料結構中,資料結構中的selemtype和ele...