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
資料結構問題void A linklistl 和void A linklist l 的區別是什麼
書中的寫法void initlist linklist l 是為了告訴讀者,這裡需要傳入一個指標而已 我記得上課的時候老師是這麼說的 函式宣告和實現時寫void initlist struct lnode l 呼叫這個函式時寫initlist linklist l 我就這麼理解的 l就是l的值,是l...
資料結構中有關棧的問題
1 3,你看看進出順序 棧先進入a,然後b進站 棧中有ab b出戰 棧中只有a c進站,d進站 此時棧中有acd d出戰,c出戰 棧中只有a e進站,f進站 棧中aef e出戰,f出戰 棧中只有a a出戰 棧空!棧中最多的時候是acd或者aef,所以至少容量大於3!2 3.1.2!1.2.3先後進站...
C語言中,資料結構儲存結構屬於線性還是非線性
這個不能一概而論 通常所說的陣列是線性儲存的,還有資料結構書中說的線性表,連結串列通常是非線性的 其他的資料結構資料結構儲存結構包括順序儲存結構和鏈式儲存結構 順序結構 資料元素存放的地址是連續的 線性的儲存 鏈式結構 資料元素存放的地址是否連續沒有要求 非線性的儲存 資料結構儲存結構包括順序儲存結...