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
資料結構的問題,資料結構的定義問題
就是幾個小錯誤 對照著看下就行,關於頭指標,如果不採用返回值的方法建立,就得使用指標的指標或者對指標的引用了。指標本身也是一個變數,它有自己的地址同時它的值也是地址,所以不採用引用或者指標的指標這樣傳遞,在函式作為實參傳遞後,函式內的指標就是另一個臨時的指標了,雖然它們儲存的值是一樣的,但是在進行分...
在資料結構中,資料的邏輯結構,資料的儲存結構及資料的運算之間存在著怎麼樣的關係
資料的邏輯結構決定了資料間運算關係的具體定義,而資料的儲存結構與資料的運算方法,沒有直接的關係,資料的儲存結構決定了維護資料邏輯結構時各種操作的運算複雜程度。在資料結構中,資料的邏輯結構,資料的儲存結構及資料的運算之間存在著怎麼樣的 資料的儲存結構及資料的運算之間存在著怎樣的關係 在資料結構中,邏輯...
資料結構問題
談談如何學習資料結構 1.如果你沒有學過c語言,或者c語言學的不好的時候把資料結構當成一本數學書來學,它所講述的都是一些簡單的圖論。在你的大腦中的主線不能丟失 線性結構,樹結構和圖結構。當你不再考慮複雜的程式設計時,僅僅研究個個離散點之間的關係,似乎資料結構也就不會那麼難了。2.學習好了抽象的離散點...