使用SQL Server開發應用程式
編寫預存程序與觸發器
預存程序和觸發器是使用者建立的、駐留在伺服器的一組Transact SQL查詢語句。觸發器是系統在特定條件下執行的。預存程序能夠改善應用程式的效能。當客戶程式需要存取資料時,一般要經過5個步驟才能存取到資料:
1) 查詢語句被傳送到伺服器。
2) 伺服器編譯SQL程式碼。
3) 最佳化產生查詢的執行計畫。
4) 資料引擎執行查詢。
5) 結果發回顧客程式。
預存程序是在創建時編譯的,當預存程序第一次執行時,SQL Server產生查詢執行計劃並將其儲存進來,以利於將來使用。當透過預存程序發出一個請求時,上述的第2和第3步就沒有了,這能大大改善系統的效能。即使在第1步上也能提高效能。因為此時傳送到伺服器的語句只是一條預存程序的EXECUTE語句,而不是龐大的、複雜的查詢。這種特性能降低網路的流量。
除了效能方面的改善外,預存程序還提供了方便地集中維護應用程式的功能。如果將查詢嵌入到應用程式中。而又需要對查詢進行改變,則應用程式需要重新編譯,並重新發佈到所有的客戶端。而在預存程序中,修改對使用者而言是透明的,它只需要在伺服器上重新編譯預存程序。
預存程序還能提供安全機制,儘管使用者可能無權執行預存程序中的命令,但它卻可能有權執行預存程序本身。有時候,系統管理員不會給予使用者以資料修改(UPDATE、INSERT和DELETE)的權力。創建的預存程序卻能進行這些操作。當然用戶需要擁有執行該預存程序的權力。
建立預存程序
預存程序可達到下列目的:
· 帶參數。
· 傳回狀態值。
· 呼叫其它預存程序。
· 在遠端伺服器上執行。
預存程序在「sysobjects」系統表中有一個表項,其型別為「P」。預存程序的文字儲存在「syscomments」系統表中。建立預存程序需要使用Transact SQL指令CREATE PROCEDURE。
例如:
USE pubs
GO
CREATE PROCEDURE ap_GetAuthorsForPublisher
AS
SELECT a.au_lname,a.au_fname
FROM authors a, titleauthor ta, titles t, publishers p
WHERE a.au_id = ta.Au_id
AND ta. Title_id = t.title_id
AND t.pub_id = p.pub_id
AND p.pub_name = 'New Moon Books?
CREATE PROC[DURE] procedure_name [;number]
[@ parameter_name ][OUTPUT] [,_n] ]
[WITH {RECOMPILE | ENCRYPTION}]🎠 AS
Number是用來將相同名字的流程分組的整數。分組是將所有的過程透過drop procedure語句組合到一個分組中。
@parameter_name指定參數的名稱。
RECOMPILE表示每次執行程序時請編譯。
ENCRYPTION表示過程的文字在「syscomments」表中要加密。
FOR REPLICATION表示程序不能在提交伺服器上執行。
將參數傳遞給預存程序
預存程序能夠接受參數。
注意:製程的參數也可以是使用者定義的資料型態。
給參數一個缺省值
使用者也可為預存程序中的參數定義缺省值。當執行時沒有提供所需的參數時,系統就會使用預設值作為參數。如果既沒有定義預設值,又沒有在執行時提供參數,則SQL Server就會傳回錯誤。在預存程序中定義預設值,並使用一些邏輯檢測是否指定了參數從而採取相應的行動,這是一個很好的習慣。
例如:
USE pubs
GO
@PublisherName varchar(40) = 'New Moon Books'
AS
SEL publishers p
WHERE a.au_id = ta.Au_id
AND ta.Title_id = t.title_id
PublisherName
GO
以上是SQL Server 7.0 入門(五)的內容,更多相關內容請關注PHP中文網(www.php.cn)!