本文從sql儲存過程的概念,優點,語法,建立技巧,呼叫等多方面介紹了sql儲存過程。
一、sql儲存過程的概念,優點及語法
整理在學習程式過程之前,先了解下什麼是儲存過程?為什麼要用儲存過程,他有那些優點
定義:將常用的或很複雜的工作,預先用sql語句寫好並用乙個指定的名稱儲存起來, 那麼以後要叫資料庫提供與已定義好的儲存過程的功能相同的服務時,只需呼叫execute,即可自動完成命令。
講到這裡,可能有人要問:這麼說儲存過程就是一堆sql語句而已啊? microsoft公司為什麼還要新增這個技術呢?
那麼儲存過程與一般的sql語句有什麼區別呢?
儲存過程的優點:
1.儲存過程只在創造時進行編譯,以後每次執行儲存過程都不需再重新編譯,而一般sql語句每執行一次就編譯一次,所以使用儲存過程可提高資料庫執行速度。
2.當對資料庫進行複雜操作時(如對多個表進行update,insert,query,delete時),可將此複雜操作用儲存過程封裝起來與資料庫提供的事務處理結合一起使用。
3.儲存過程可以重複使用,可減少資料庫開發人員的工作量
4.安全性高,可設定只有某此使用者才具有對指定儲存過程的使用權
儲存過程的種類:
如 sp_help就是取得指定物件的相關資訊
2.擴充套件儲存過程 以xp_開頭,用來呼叫作業系統提供的功能
以下為引用的內容:
exec master..xp_cmdshell 'ping 10.8.16.1'
3.使用者自定義的儲存過程,這是我們所指的儲存過程
常用格式
以下為引用的內容:
create procedure procedue_name
[@parameter data_type][output]
[with]
assql_statement
解釋:output:表示此引數是可傳回的
with
recompile:表示每次執行此儲存過程時都重新編譯一次
encryption:所建立的儲存過程的內容會被加密
二、sql儲存過程學習:儲存過程的建立
表book的內容如下
編號 書名 **
001 c語言入門 $30
002 powerbuilder報表開發 $52
例項1:查詢表book的內容的儲存過程
create proc query_book
as select * from book
go exec query_book
例項2:加入一筆記錄到表book,並查詢此表中所有書籍的總金額
create proc insert_book
@param1 char(10),@param2 varchar(20),@param3 money,@param4 money output
with encryption ---------加密
as insert book(編號,書名,**) values(@param1,@param2,@param3)
select @param4=sum(**) from book
go執行例子:
declare @total_price money
exec insert_book '003','delphi 控制項開發指南',$100,@total_price
print '總金額為'+convert(varchar,@total_price)
go儲存過程的3種傳回值:
1.以return傳回整數
2.以output格式傳回引數
3.recordset
傳回值的區別:
output和return都可在批次程式中用變數接收,而recordset則傳回到執行批次的客戶端中
例項3:設有兩個表為product,order,其表內容如下:
以下為引用的內容:
product
產品編號 產品名稱 客戶訂數
001 鋼筆 30
002 毛筆 50
003 鉛筆 100
order
產品編號 客戶名 客戶訂金
001 南山區 $30
002 羅湖區 $50
003 寶安區 $4
請實現按編號為連線條件,將兩個表連線成乙個臨時表,該錶只含編號.產品名.客戶名.訂金.總金額,
總金額=訂金*訂數,臨時表放在儲存過程中
**如下:
create proc temp_sale
as select a.產品編號,a.產品名稱,b.客戶名,b.客戶訂金,a.客戶訂數* b.客戶訂金 as總金額
into #temptable from product a inner join order b on a.產品編號=b.產品編號
if @@error=0
print 'good'
else
print 'fail'
go三、sql儲存過程學習:儲存過程的呼叫
呼叫帶引數儲存過程的幾種方式
1) 這也是最簡單的方法,兩個輸入引數,無返回值,用於insert,update,delete操作較多。
以下為引用的內容:
conn.execute "procname varvalue1,varvalue2"
2) 如果要返回 recordset 集:
以下為引用的內容:
set rs = server.createobject("adodb.recordset")
rs.open "exec procname varvalue1, varvalue2",conn
3) 以上兩種方法都不能有返回值,(recordset除外),如果要得到返回值,需要用command的方法。
首先說明,返回值有兩種。一種是在儲存過程中直接return乙個值,就象c和vb的函式返回值那樣;另一種是可以返回多個值,儲存這些值的變數名稱需要在呼叫引數中先行指定。
四、特殊的儲存過程-觸發器
1.觸發器的概念及作用
觸發器是一種特殊型別的儲存過程,它不同於我們前面介紹過的儲存過程。觸發器主要是通過事件進行觸發而被執行的,而儲存過程可以通過儲存過程名字而被直接呼叫。當對某一表進行諸如update、 insert、 delete 這些操作時,sql server 就會自動執行觸發器所定義的sql 語句,從而確保對資料的處理必須符合由這些sql 語句所定義的規則。
觸發器的主要作用就是其能夠實現由主鍵和外來鍵所不能保證的複雜的參照完整性和資料的一致性。除此之外,觸發器還有其它許多不同的功能:
(1) 強化約束(enforce restriction)
觸發器能夠實現比check 語句更為複雜的約束。
(2) 跟蹤變化auditing changes
觸發器可以偵測資料庫內的操作,從而不允許資料庫中未經許可的指定更新和變化。
(3) 級聯執行(cascaded operation)。
觸發器可以偵測資料庫內的操作,並自動地級聯影響整個資料庫的各項內容。例如,某個表上的觸發器中包含有對另外乙個表的資料操作(如刪除,更新,插入)而該操作又導致該錶上觸發器被觸發。
(4) 儲存過程的呼叫(stored procedure invocation)。
為了響應資料庫更新觸,髮器可以呼叫乙個或多個儲存過程,甚至可以通過外部過程的呼叫而在dbms( 資料庫管理系統)本身之外進行操作。
由此可見,觸發器可以解決高階形式的業務規則或複雜行為限制以及實現定製記錄等一些方面的問題。例如,觸發器能夠找出某一表在資料修改前後狀態發生的差異,並根據這種差異執行一定的處理。此外乙個表的同一型別(insert、 update、 delete)的多個觸發器能夠對同一種資料操作採取多種不同的處理。
總體而言,觸發器效能通常比較低。當執行觸發器時,系統處理的大部分時間花費在參照其它表的這一處理上,因為這些表既不在記憶體中也不在資料庫裝置上,而刪除表和插入表總是位於記憶體中。可見觸發器所參照的其它表的位置決定了操作要花費的時間長短。
2.觸發器的種類
sql server 2000 支援兩種型別的觸發器:after 觸發器和instead of 觸發器。其中after 觸發器即為sql server 2000 版本以前所介紹的觸發器。該型別觸發器要求只有執行某一操作(insert update delete) 之後,觸發器才被觸發,且只能在表上定義。可以為針對表的同一操作定義多個觸發器。對於after 觸發器,可以定義哪乙個觸發器被最先觸發,哪乙個被最後觸發,通常使用系統過程sp_settriggerorder 來完成此任務。
instead of 觸發器表示並不執行其所定義的操作(insert、 update、 delete),而僅是執行觸發器本身。既可在表上定義instead of 觸發器,也可以在檢視上定義instead of 觸發器,但對同一操作只能定義乙個instead of 觸發器。
SQLSERVER學習七 儲存過程
1 普通儲存過程 create proc thc proc v1 int,v2 int create proc 儲存過程名稱 引數1 引數型別,asbegin print v1 v2 列印訊息 select from table 1 查詢結果,最後會輸出結果,此處也可執行刪除 更新 新增等操作 en...
SQL Server儲存過程入門學習
儲存過程的定義,儲存過程 stored procedure 是一組為了完成特定功能的sql 語句,集經編譯後儲存在資料庫中,使用者通過指定儲存過程的名字並給出引數,如果該儲存過程帶有引數來執行。在sql server 的系列版本中,儲存過程分為兩類 系統提供的儲存過程和使用者自定義儲存過程。系統sp...
sql server儲存過程
建立表的語句 create table student sno int primary key,sname nvarchar 30 sgentle nvarchar 2 sage int,sbirth smalldatetime,sdept nvarchar 30 drop table studen...