| SQL Server 7.0 入門(mén)(五) |
| 來(lái)源:轉載 瀏覽數:49 錄入時(shí)間:2006-3-2 |
| 使用SQL Server開(kāi)發(fā)應用程序 編寫(xiě)存儲過(guò)程與觸發(fā)器 存儲過(guò)程和觸發(fā)器是由用戶(hù)創(chuàng )建的、駐留在服務(wù)器的一組Transact SQL查詢(xún)語(yǔ)句。觸發(fā)器是系統在特定條件下執行的。存儲過(guò)程能夠改善應用程序的性能。當客戶(hù)程序需要訪(fǎng)問(wèn)數據時(shí),一般要經(jīng)過(guò)5個(gè)步驟才能訪(fǎng)問(wèn)到數據: 1) 查詢(xún)語(yǔ)句被發(fā)送到服務(wù)器。 2) 服務(wù)器編譯SQL代碼。 3) 優(yōu)化產(chǎn)生查詢(xún)的執行計劃。 4) 數據引擎執行查詢(xún)。 5) 結果發(fā)回客戶(hù)程序。 存儲過(guò)程是在創(chuàng )建時(shí)編譯的,當存儲過(guò)程第一次執行時(shí),SQL Server產(chǎn)生查詢(xún)執行計劃并將其存儲進(jìn)來(lái),以利于將來(lái)使用。當通過(guò)存儲過(guò)程發(fā)出一個(gè)請求時(shí),上述的第2和第3步就沒(méi)有了,這能大大改善系統的性能。即使在第1步上也能提高性能。因為此時(shí)發(fā)送到服務(wù)器的語(yǔ)句只是一條存儲過(guò)程的EXECUTE語(yǔ)句,而不是龐大的、復雜的查詢(xún)。這種特性能降低網(wǎng)絡(luò )的流量。 除了性能方面的改善外,存儲過(guò)程還提供了方便地集中維護應用程序的功能。如果將查詢(xún)嵌入到應用程序中。而又需要對查詢(xún)進(jìn)行改變,則應用程序需要重新編譯,并重新發(fā)布到所有的客戶(hù)端。而在存儲過(guò)程中,修改對用戶(hù)而言是透明的,它只需要在服務(wù)器上重新編譯存儲過(guò)程。 存儲過(guò)程還能提供安全機制,盡管用戶(hù)可能無(wú)權執行存儲過(guò)程中的命令,但它卻可能有權執行存儲過(guò)程本身。有時(shí)候,系統管理員不會(huì )給用戶(hù)以數據修改(UPDATE、INSERT和DELETE)的權力。創(chuàng )建的存儲過(guò)程卻能進(jìn)行這些操作。當然用戶(hù)需要擁有執行該存儲過(guò)程的權力。 建立存儲過(guò)程 存儲過(guò)程可以達到以下目的: · 帶參數。 · 返回狀態(tài)值。 · 調用其它存儲過(guò)程。 · 在遠程服務(wù)器上執行。 存儲過(guò)程在“sysobjects”系統表中有一個(gè)表項,其類(lèi)型為“P”。存儲過(guò)程的文本存儲在“syscomments”系統表中。創(chuàng )建存儲過(guò)程需要使用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’ GO CREATE PROCEDURE語(yǔ)句的語(yǔ)法如下: CREATE PROC[DURE] procedure_name [;number] [WITH {RECOMPILE | ENCRYPTION}] [FOR REPLICATION] AS Number是用來(lái)對相同名字的過(guò)程進(jìn)行分組的整數。分組是將所有的過(guò)程通過(guò)drop procedure語(yǔ)句組合到一個(gè)分組中。 @parameter_name指定參數的名稱(chēng)。 RECOMPILE表示每次執行過(guò)程時(shí)都要進(jìn)行編譯。 ENCRYPTION表示過(guò)程的文本在“syscomments”表中要加密。 FOR REPLICATION表示過(guò)程不能在提交服務(wù)器上執行。 將參數傳遞給存儲過(guò)程 存儲過(guò)程能夠接受參數。 注意:過(guò)程的參數也可以是用戶(hù)定義的數據類(lèi)型。 給參數一個(gè)缺省值 用戶(hù)還可以為存儲過(guò)程中的參數定義缺省值。當在執行時(shí)沒(méi)有提供所需的參數時(shí),系統就使用缺省值作為參數。如果既沒(méi)有定義缺省值,又沒(méi)有在執行時(shí)提供參數,則SQL Server就會(huì )返回一個(gè)錯誤。在存儲過(guò)程中定義缺省值,并使用一些邏輯檢測是否指定了參數從而采取相應的行動(dòng),這是一種很好的習慣。 例如: USE pubs GO CREATE PROCEDURE ap_GetAuthorsForPublisher @PublisherName varchar(40) = ‘New Moon Books’ 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 = @PublisherName GO |
聯(lián)系客服