存儲(chǔ)過程總結(jié)_第1頁
存儲(chǔ)過程總結(jié)_第2頁
存儲(chǔ)過程總結(jié)_第3頁
存儲(chǔ)過程總結(jié)_第4頁
存儲(chǔ)過程總結(jié)_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、1. SQL存儲(chǔ)過程概述在 大型數(shù)據(jù)庫系統(tǒng)中,存儲(chǔ)過程和觸發(fā)器具有很重要的作用。無論是存儲(chǔ)過程還是觸發(fā)器,都是SQL 語句和流程控制語句的集合。就本質(zhì)而言,觸發(fā)器也是一種存儲(chǔ)過程。存儲(chǔ)過程在運(yùn)算時(shí)生成執(zhí)行方式,所以,以后對(duì)其再運(yùn)行時(shí)其執(zhí)行速度很快。SQL Server 2000 不僅提供了用戶自定義存儲(chǔ)過程的功能,而且也提供了許多可作為工具使用的系統(tǒng)存儲(chǔ)過程。存儲(chǔ)過程的概念存儲(chǔ)過程(Stored Procedure)是一組為了完成特定功能的SQL 語句集,經(jīng)編譯后存儲(chǔ)在數(shù)據(jù)庫。中用戶通過指定存儲(chǔ)過程的名字并給出參數(shù)(如果該存儲(chǔ)過程帶有參數(shù))來執(zhí)行它。在SQL Server 的系列版本中存儲(chǔ)過程

2、分為兩類:系統(tǒng)提供的存儲(chǔ)過程和用戶自定義存儲(chǔ)過程。系統(tǒng)過程主要存儲(chǔ)在master 數(shù)據(jù)庫中并以sp_為前綴,并且系統(tǒng)存儲(chǔ)過程主要是從系統(tǒng)表中獲取信息,從而為系統(tǒng)管理員管理SQL Server 提供支持。通過系統(tǒng)存儲(chǔ)過程,MS SQL Server 中的許多管理性或信息性的活動(dòng)(如了解數(shù)據(jù)庫對(duì)象、數(shù)據(jù)庫信息)都可以被順利有效地完成。盡管這些系統(tǒng)存儲(chǔ)過程被放在master 數(shù)據(jù)庫中,但是仍可以在其它數(shù)據(jù)庫中對(duì)其進(jìn)行調(diào)用,在調(diào)用時(shí)不必在存儲(chǔ)過程名前加上數(shù)據(jù)庫名。而且當(dāng)創(chuàng)建一個(gè)新數(shù)據(jù)庫時(shí),一些系統(tǒng)存儲(chǔ)過程會(huì)在新數(shù)據(jù)庫中 被自動(dòng)創(chuàng)建。用戶自定義存儲(chǔ)過程是由用戶創(chuàng)建并能完成某一特定功能(如查詢用戶所需數(shù)據(jù)

3、信息)的存儲(chǔ)過程。在本章中所涉及到的存儲(chǔ)過程主要是指用戶自定義存儲(chǔ)過程。存儲(chǔ)過程的優(yōu)點(diǎn) 當(dāng)利用MS SQL Server 創(chuàng)建一個(gè)應(yīng)用程序時(shí),Transaction-SQL 是一種主要的編程語言。若運(yùn)用Transaction-SQL 來進(jìn)行編程,有兩種方法。其一是,在本地存儲(chǔ)Transaction- SQL 程序,并創(chuàng)建應(yīng)用程序向SQL Server 發(fā)送命令來對(duì)結(jié)果進(jìn)行處理。其二是,可以把部分用Transaction-SQL 編寫的程序作為存儲(chǔ)過程存儲(chǔ)在SQL Server 中,并創(chuàng)建應(yīng)用程序來調(diào)用存儲(chǔ)過程,對(duì)數(shù)據(jù)結(jié)果進(jìn)行處理存儲(chǔ)過程能夠通過接收參數(shù)向調(diào)用者返回結(jié)果集,結(jié)果集的格式由調(diào)用者確

4、定;返回狀態(tài)值給調(diào)用者,指 明調(diào)用是成功或是失??;包括針對(duì)數(shù)據(jù)庫的操作語句,并且可以在一個(gè)存儲(chǔ)過程中調(diào)用另一存儲(chǔ)過程。 我們通常更偏愛于使用第二種方法,即在SQL Server 中使用存儲(chǔ)過程而不是在客戶計(jì)算機(jī)上調(diào)用Transaction-SQL 編寫的一段程序,原因在于存儲(chǔ)過程具有以下優(yōu)點(diǎn):(1) 存儲(chǔ)過程允許標(biāo)準(zhǔn)組件式編程 存儲(chǔ)過程在被創(chuàng)建以后可以在程序中被多次調(diào)用,而不必重新編寫該存儲(chǔ)過程的SQL 語句。而且數(shù)據(jù)庫專業(yè)人員可隨時(shí)對(duì)存儲(chǔ)過程進(jìn)行修改,但對(duì)應(yīng)用程序源代碼毫無影響(因?yàn)閼?yīng)用程序源代碼只包含存儲(chǔ)過程的調(diào)用語句),從而極大地提高了程序的可移植性。 (2) 存儲(chǔ)過程能夠?qū)崿F(xiàn)較快的執(zhí)行

5、速度 如果某一操作包含大量的Transaction-SQL 代碼或分別被多次執(zhí)行,那么存儲(chǔ)過程要比批處理的執(zhí)行速度快很多。因?yàn)榇鎯?chǔ)過程是預(yù)編譯的,在首次運(yùn)行一個(gè)存儲(chǔ)過程時(shí),查詢優(yōu)化器對(duì)其進(jìn)行分析、優(yōu)化,并 給出最終被存在系統(tǒng)表中的執(zhí)行計(jì)劃。而批處理的Transaction- SQL 語句在每次運(yùn)行時(shí)都要進(jìn)行編譯和優(yōu)化,因此速度相對(duì)要慢一些。(3) 存儲(chǔ)過程能夠減少網(wǎng)絡(luò)流量 對(duì)于同一個(gè)針對(duì)數(shù)據(jù)數(shù)據(jù)庫對(duì)象的操作(如查詢、修改),如果這一操作所涉及到的 Transaction-SQL 語句被組織成一存儲(chǔ)過程,那么當(dāng)在客戶計(jì)算機(jī)上調(diào)用該存儲(chǔ)過程時(shí),網(wǎng)絡(luò)中傳送的只是該調(diào)用語句,否則將是多條SQL 語句,

6、從而大大增加了網(wǎng)絡(luò)流量,降低網(wǎng)絡(luò)負(fù)載。 4) 存儲(chǔ)過程可被作為一種安全機(jī)制來充分利用 系統(tǒng)管理員通過對(duì)執(zhí)行某一存儲(chǔ)過程的權(quán)限進(jìn)行限制,從而能夠?qū)崿F(xiàn)對(duì)相應(yīng)的數(shù)據(jù)訪問權(quán)限的限制,避免非授權(quán)用戶對(duì)數(shù)據(jù)的訪問,保證數(shù)據(jù)的安全。注意:存儲(chǔ)過程雖然既有參數(shù)又有返回值,但是它與函數(shù)不同。存儲(chǔ)過程的返回值只是指明執(zhí)行是否成功,并且它不能像函數(shù)那樣被直接調(diào)用,也就是在調(diào)用存儲(chǔ)過程時(shí),在存儲(chǔ)過程名字前一定要有EXEC保留字。 2.SQL存儲(chǔ)過程創(chuàng)建 存儲(chǔ)過程是保存起來的可以接受和返回用戶提供的參數(shù)的 Transact-SQL 語句的集合。 可以創(chuàng)建一個(gè)過程供永久使用,或在一個(gè)會(huì)話中臨時(shí)使用(局部臨時(shí)過程),或在所

7、有會(huì)話中臨時(shí)使用(全局臨時(shí)過程)。 也可以創(chuàng)建在 Microsoft SQL Server 啟動(dòng)時(shí)自動(dòng)運(yùn)行的存儲(chǔ)過程。語法 CREATE PROC EDURE procedure_name ; number parameter data_type VARYING = default OUTPUT ,.n WITH RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION FOR REPLICATION AS sql_statement .n 參數(shù) procedure_name 新存儲(chǔ)過程的名稱。過程名必須符合標(biāo)識(shí)符規(guī)則,且對(duì)于數(shù)據(jù)庫及其所有者必須唯一。 要

8、創(chuàng)建局部臨時(shí)過程,可以在 procedure_name 前面加一個(gè)編號(hào)符 (#procedure_name),要?jiǎng)?chuàng)建全局臨時(shí)過程,可以在 procedure_name 前面加兩個(gè)編號(hào)符 (#procedure_name)。完整的名稱(包括 # 或 #)不能超過 128 個(gè)字符。指定過程所有者的名稱是可選的。 number 是可選的整數(shù),用來對(duì)同名的過程分組,以便用一 條 DROP PROCEDURE 語句即可將同組的過程一起除去。例如,名為 orders 的應(yīng)用程序使用的過程可以命名為 orderproc;1、orderproc;2 等。DROP PROCEDURE orderproc 語句將

9、除去整個(gè)組。如果名稱中包含定界標(biāo)識(shí)符,則數(shù)字不應(yīng)包含在標(biāo)識(shí)符中,只應(yīng)在 procedure_name 前后使用適當(dāng)?shù)亩ń绶?parameter 過程中的參數(shù)。在 CREATE PROCEDURE 語句中可以聲明一個(gè)或多個(gè)參數(shù)。用戶必須在執(zhí)行過程時(shí)提供每個(gè)所聲明參數(shù)的值(除非定義了該參數(shù)的默認(rèn)值)。存儲(chǔ)過程最多可以有 2.100 個(gè)參數(shù)。 使用 符號(hào)作為第一個(gè)字符來指定參數(shù)名稱。參數(shù)名稱必須符合標(biāo)識(shí)符的規(guī)則。每個(gè)過程的參數(shù)僅用于該過程本身;相同的參數(shù)名稱可以用在其它過程中。默認(rèn)情況下,參數(shù)只能代替常量,而不能用于代替表名、列名或其它數(shù)據(jù)庫對(duì)象的名稱。 data_type 參數(shù)的數(shù)據(jù)類型。所有數(shù)

10、據(jù)類型(包括 text、ntext 和 image)均可以用作存儲(chǔ)過程的參數(shù)。不過,cursor 數(shù)據(jù)類型只能用于 OUTPUT 參數(shù)。如果指定的數(shù)據(jù)類型為 cursor,也必須同時(shí)指定 VARYING 和 OUTPUT 關(guān)鍵字。 說明對(duì)于可以是 cursor 數(shù)據(jù)類型的輸出參數(shù),沒有最大數(shù)目的限制。 VARYING 指定作為輸出參數(shù)支持的結(jié)果集(由存儲(chǔ)過程動(dòng)態(tài)構(gòu)造,內(nèi)容可以變化)。僅適用于游標(biāo)參數(shù)。 default 參數(shù)的默認(rèn)值。如果定義了默認(rèn)值,不必指定該參數(shù)的值即可執(zhí)行過程。默認(rèn)值必須是常量或 NULL。如果過程將對(duì)該參數(shù)使用 LIKE 關(guān)鍵字,那么默認(rèn)值中可以包含通配符(%、_、 和

11、)。 OUTPUT 表明參數(shù)是返回參數(shù)。該選項(xiàng)的值可以返回給 EXECUTE。使用 OUTPUT 參數(shù)可將信息返回給調(diào)用過程。Text、ntext 和 image 參數(shù)可用作 OUTPUT 參數(shù)。使用 OUTPUT 關(guān)鍵字的輸出參數(shù)可以是游標(biāo)占位符。 n 表示最多可以指定 2.100 個(gè)參數(shù)的占位符。 RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION RECOMPILE 表明 SQL Server 不會(huì)緩存該過程的計(jì)劃,該過程將在運(yùn)行時(shí)重新編譯。在使用非典型值或臨時(shí)值而不希望覆蓋緩存在內(nèi)存中的執(zhí)行計(jì)劃時(shí),請(qǐng)使用 RECOMPILE 選項(xiàng)。 ENCRY

12、PTION 表示 SQL Server 加密 syscomments 表中包含 CREATE PROCEDURE 語句文本的條目。使用 ENCRYPTION 可防止將過程作為 SQL Server 復(fù)制的一部分發(fā)布。 說明在升級(jí)過程中,SQL Server 利用存儲(chǔ)在 syscomments 中的加密注釋來重新創(chuàng)建加密過程。 FOR REPLICATION 指定不能在訂閱服務(wù)器上執(zhí)行為復(fù)制創(chuàng)建的存儲(chǔ)過程。.使用 FOR REPLICATION 選項(xiàng)創(chuàng)建的存儲(chǔ)過程可用作存儲(chǔ)過程篩選,且只能在復(fù)制過程中執(zhí)行。本選項(xiàng)不能和 WITH RECOMPILE 選項(xiàng)一起使用。 AS 指定過程要執(zhí)行的操作。

13、sql_statement 過程中要包含的任意數(shù)目和類型的 Transact-SQL 語句。但有一些限制。 n 是表示此過程可以包含多條 Transact-SQL 語句的占位符。 注釋 存儲(chǔ)過程的最大大小為 128 MB。 用戶定義的存儲(chǔ)過程只能在當(dāng)前數(shù)據(jù)庫中創(chuàng)建(臨時(shí)過程除外,臨時(shí)過程總是在 tempdb 中創(chuàng)建)。在單個(gè)批處理中,CREATE PROCEDURE 語句不能與其它 Transact-SQL 語句組合使用。 默認(rèn)情況下,參數(shù)可為空。如果傳遞 NULL 參數(shù)值并且該參數(shù)在 CREATE 或 ALTER TABLE 語句中使用,而該語句中引用的列又不允許使用 NULL,則 SQL

14、Server 會(huì)產(chǎn)生一條錯(cuò)誤信息。為了防止向不允許使用 NULL 的列傳遞 NULL 參數(shù)值,應(yīng)向過程中添加編程邏輯或?yàn)樵摿惺褂媚J(rèn)值(使用 CREATE 或 ALTER TABLE 的 DEFAULT 關(guān)鍵字)。 建議在存儲(chǔ)過程的任何 CREATE TABLE 或 ALTER TABLE 語句中都為每列顯式指定 NULL 或 NOT NULL,例如在創(chuàng)建臨時(shí)表時(shí)。ANSI_DFLT_ON 和 ANSI_DFLT_OFF 選項(xiàng)控制 SQL Server 為列指派 NULL 或 NOT NULL 特性的方式(如果在 CREATE TABLE 或 ALTER TABLE 語句中沒有指定的話)。如果

15、某個(gè)連接執(zhí)行的存儲(chǔ)過程對(duì)這些選項(xiàng)的設(shè)置與創(chuàng)建該過程的連接的設(shè)置不同,則為第二個(gè)連接創(chuàng)建的表列可能會(huì)有不同的為空性,并且 表現(xiàn)出不同的行為方式。如果為每個(gè)列顯式聲明了 NULL 或 NOT NULL,那么將對(duì)所有執(zhí)行該存儲(chǔ)過程的連接使用相同的為空性創(chuàng)建臨時(shí)表。 在創(chuàng)建或更改存儲(chǔ)過程時(shí),SQL Server 將保存 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 的設(shè)置。執(zhí)行存儲(chǔ)過程時(shí),將使用這些原始設(shè)置。因此,所有客戶端會(huì)話的 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 設(shè)置在執(zhí)行存儲(chǔ)過程時(shí)都將被忽略。在存儲(chǔ)過程中出現(xiàn)的 SET Q

16、UOTED_IDENTIFIER 和 SET ANSI_NULLS 語句不影響存儲(chǔ)過程的功能。 其它 SET 選項(xiàng)(例如 SET ARITHABORT、SET ANSI_WARNINGS 或 SET ANSI_PADDINGS)在創(chuàng)建或更改存儲(chǔ)過程時(shí)不保存。如果存儲(chǔ)過程的邏輯取決于特定的設(shè)置,應(yīng)在過程開頭添加一條 SET 語句,以確保設(shè)置正確。從存儲(chǔ)過程中執(zhí)行 SET 語句時(shí),該設(shè)置只在存儲(chǔ)過程完成之前有效。之后,設(shè)置將恢復(fù)為調(diào)用存儲(chǔ)過程時(shí)的值。這使個(gè)別的客戶端可以設(shè)置所需的選項(xiàng),而不會(huì)影響存儲(chǔ)過程的邏輯。說明SQL Server 是將空字符串解釋為單個(gè)空格還是解釋為真正的空字符串,由兼容級(jí)別

17、設(shè)置控制。 如果兼容級(jí)別小于或等于 65,SQL Server 就將空字符串解釋為單個(gè)空格。 如果兼容級(jí)別等于 70,則 SQL Server 將空字符串解釋為空字符串。 獲得有關(guān)存儲(chǔ)過程的信息 若要顯示用來創(chuàng)建過程的文本,請(qǐng)?jiān)谶^程所在的數(shù)據(jù)庫中執(zhí)行 sp_helptext,并使用過程名作為參數(shù)。 說明使用 ENCRYPTION 選項(xiàng)創(chuàng)建的存儲(chǔ)過程不能使用 sp_helptext 查看。 若要顯示有關(guān)過程引用的對(duì)象的報(bào)表,請(qǐng)使用 sp_depends。 若要為過程重命名,請(qǐng)使用 sp_rename。 引用對(duì)象 SQL Server 允許創(chuàng)建的存儲(chǔ)過程引用尚不存在的對(duì)象。在創(chuàng)建時(shí),只進(jìn)行語法檢查

18、。執(zhí)行時(shí),如果高速緩存中尚無有效的計(jì)劃,則編譯存儲(chǔ)過程以生成執(zhí)行計(jì)劃。只有在編譯過 程中才解析存儲(chǔ)過程中引用的所有對(duì)象。因此,如果語法正確的存儲(chǔ)過程引用了不存在的對(duì)象,則仍可以成功創(chuàng)建,但在運(yùn)行時(shí)將失敗,因?yàn)樗玫膶?duì)象不存在。 延遲名稱解析和兼容級(jí)別 SQL Server 允許 Transact-SQL 存儲(chǔ)過程在創(chuàng)建時(shí)引用不存在的表。這種能力稱為延遲名稱解析。不過,如果 Transact-SQL 存儲(chǔ)過程引用了該存儲(chǔ)過程中定義的表,而兼容級(jí)別設(shè)置(通過執(zhí)行 sp_dbcmptlevel 來設(shè)置)為 65,則在創(chuàng)建時(shí)會(huì)發(fā)出警告信息。而如果在運(yùn)行時(shí)所引用的表不存在,將返回錯(cuò)誤信息。執(zhí)行存儲(chǔ)過程

19、 成功執(zhí)行 CREATE PROCEDURE 語句后,過程名稱將存儲(chǔ)在 sysobjects 系統(tǒng)表中,而 CREATE PROCEDURE 語句的文本將存儲(chǔ)在 syscomments 中。第一次執(zhí)行時(shí),將編譯該過程以確定檢索數(shù)據(jù)的最佳訪問計(jì)劃。 使用 cursor 數(shù)據(jù)類型的參數(shù) 存儲(chǔ)過程只能將 cursor 數(shù)據(jù)類型用于 OUTPUT 參數(shù)。如果為某個(gè)參數(shù)指定了 cursor 數(shù)據(jù)類型,也必須指定 VARYING 和 OUTPUT 參數(shù)。如果為某個(gè)參數(shù)指定了 VARYING 關(guān)鍵字,則數(shù)據(jù)類型必須是 cursor,并且必須指定 OUTPUT 關(guān)鍵字。 說明cursor 數(shù)據(jù)類型不能通過數(shù)據(jù)

20、庫 API(例如 OLE DB、ODBC、ADO 和 DB-Library)綁定到應(yīng)用程序變量上。因?yàn)楸仨毾冉壎?OUTPUT 參數(shù),應(yīng)用程序才可以執(zhí)行存儲(chǔ)過程,所以帶有 cursor OUTPUT 參數(shù)的存儲(chǔ)過程不能通過數(shù)據(jù)庫 API 調(diào)用。只有將 cursor OUTPUT 變量賦值給 Transact-SQL 局部 cursor 變量時(shí),才可以通過 Transact-SQL 批處理、存儲(chǔ)過程或觸發(fā)器調(diào)用這些過程。Cursor 輸出參數(shù) 在執(zhí)行過程時(shí),以下規(guī)則適用于 cursor 輸出參數(shù): 對(duì)于只進(jìn)游標(biāo),游標(biāo)的結(jié)果集中返回的行只是那些存儲(chǔ)過程執(zhí)行結(jié)束時(shí)處于或超出游標(biāo)位置的行,例如: 在過

21、程中的名為 RS 的 100 行結(jié)果集上打開一個(gè)非滾動(dòng)游標(biāo)。 過程提取結(jié)果集 RS 的頭 5 行。 過程返回到其調(diào)用者。 返回到調(diào)用者的結(jié)果集 RS 由 RS 的第 6 到 100 行組成,調(diào)用者中的游標(biāo)處于 RS 的第一行之前。 對(duì)于只進(jìn)游標(biāo),如果存儲(chǔ)過程完成后,游標(biāo)位于第一行的前面,則整個(gè)結(jié)果集將返回給調(diào)用批處理、存儲(chǔ)過程或觸發(fā)器。返回時(shí),游標(biāo)將位于第一行的前面。 對(duì)于只進(jìn)游標(biāo),如果存儲(chǔ)過程完成后,游標(biāo)的位置超出最后一行的結(jié)尾,則為調(diào)用批處理、存儲(chǔ)過程或觸發(fā)器返回空結(jié)果集。 說明空結(jié)果集與空值不同。 對(duì)于可滾動(dòng)游標(biāo),在存儲(chǔ)過程執(zhí)行結(jié)束時(shí),結(jié)果集中的所有行均會(huì)返回給調(diào)用批處理、存儲(chǔ)過程或觸發(fā)

22、器。返回時(shí),游標(biāo)保留在過程中最后一次執(zhí)行提取時(shí)的位置。 對(duì)于任意類型的游標(biāo),如果游標(biāo)關(guān)閉,則將空值傳遞回調(diào)用批處理、存儲(chǔ)過程或觸發(fā)器。如果將游標(biāo)指派給一個(gè)參數(shù),但該游標(biāo)從未打開過,也會(huì)出現(xiàn)這種情況。 說明關(guān)閉狀態(tài)只有在返回時(shí)才有影響。例如,可以在過程中關(guān)閉游標(biāo),稍后再打開游標(biāo),然后將該游標(biāo)的結(jié)果集返回給調(diào)用批處理、存儲(chǔ)過程或觸發(fā)器。 臨時(shí)存儲(chǔ)過程 SQL Server 支持兩種臨時(shí)過程:局部臨時(shí)過程和全局臨時(shí)過程。局部臨時(shí)過程只能由創(chuàng)建該過程的連接使用。全局臨時(shí)過程則可由所有連接使用。局部臨時(shí)過程在當(dāng)前會(huì)話結(jié)束 時(shí)自動(dòng)除去。全局臨時(shí)過程在使用該過程的最后一個(gè)會(huì)話結(jié)束時(shí)除去。通常是在創(chuàng)建該過程的

23、會(huì)話結(jié)束時(shí)。 臨時(shí)過程用 # 和 # 命名,可以由任何用戶創(chuàng)建。創(chuàng)建過程后,局部過程的所有者是唯一可以使用該過程的用戶。執(zhí)行局部臨時(shí)過程的權(quán)限不能授予其他用戶。如果創(chuàng)建了全局臨時(shí)過 程,則所有用戶均可以訪問該過程,權(quán)限不能顯式廢除。只有在 tempdb 數(shù)據(jù)庫中具有顯式 CREATE PROCEDURE 權(quán)限的用戶,才可以在該數(shù)據(jù)庫中顯式創(chuàng)建臨時(shí)過程(不使用編號(hào)符命名)。可以授予或廢除這些過程中的權(quán)限。 說明頻繁使用臨時(shí)存儲(chǔ)過程會(huì)在 tempdb 中的系統(tǒng)表上產(chǎn)生爭(zhēng)用,從而對(duì)性能產(chǎn)生負(fù)面影響。建議使用 sp_executesql 代替。sp_executesql 不在系統(tǒng)表中存儲(chǔ)數(shù)據(jù),因此可以

24、避免這一問題。自動(dòng)執(zhí)行存儲(chǔ)過程 SQL Server 啟動(dòng)時(shí)可以自動(dòng)執(zhí)行一個(gè)或多個(gè)存儲(chǔ)過程。這些存儲(chǔ)過程必須由系統(tǒng)管理員創(chuàng)建,并在 sysadmin 固定服務(wù)器角色下作為后臺(tái)過程執(zhí)行。這些過程不能有任何輸入?yún)?shù)。 對(duì)啟動(dòng)過程的數(shù)目沒有限制,但是要注意,每個(gè)啟動(dòng)過程在執(zhí)行時(shí)都會(huì)占用一個(gè)連接。如果必須在啟動(dòng)時(shí)執(zhí)行多個(gè)過程,但不需要并行執(zhí)行,則可以指定一個(gè)過程作為啟動(dòng)過程,讓該過程調(diào)用其它過程。這樣就只占用一個(gè)連接。 在啟動(dòng)時(shí)恢復(fù)了最后一個(gè)數(shù)據(jù)庫后,即開始執(zhí)行存儲(chǔ)過程。若要跳過這些存儲(chǔ)過程的執(zhí)行,請(qǐng)將啟動(dòng)參數(shù)指定為跟蹤標(biāo)記 4022。如果以最低配置啟動(dòng) SQL Server(使用 -f 標(biāo)記),則啟

25、動(dòng)存儲(chǔ)過程也不會(huì)執(zhí)行。 若要?jiǎng)?chuàng)建啟動(dòng)存儲(chǔ)過程,必須作為 sysadmin 固定服務(wù)器角色的成員登錄,并在 master 數(shù)據(jù)庫中創(chuàng)建存儲(chǔ)過程。 使用 sp_procoption 可以: 將現(xiàn)有存儲(chǔ)過程指定為啟動(dòng)過程。 停止在 SQL Server 啟動(dòng)時(shí)執(zhí)行過程。 查看 SQL Server 啟動(dòng)時(shí)執(zhí)行的所有過程的列表。 存儲(chǔ)過程嵌套 存儲(chǔ)過程可以嵌套,即一個(gè)存儲(chǔ)過程可以調(diào)用另一個(gè)存儲(chǔ)過程。在被調(diào)用過程開始執(zhí)行時(shí),嵌套級(jí)將增加,在被調(diào)用過程執(zhí)行結(jié)束后,嵌套級(jí)將減少。如果超出最大的嵌套級(jí),會(huì)使整個(gè)調(diào)用過程鏈?zhǔn) ?捎?NESTLEVEL 函數(shù)返回當(dāng)前的嵌套級(jí)。 若要估計(jì)編譯后的存儲(chǔ)過程大小,請(qǐng)使

26、用下列性能監(jiān)視計(jì)數(shù)器。 * 各種分類的高速緩存對(duì)象均可以使用這些計(jì)數(shù)器,包括特殊 sql、準(zhǔn)備 sql、過程、觸發(fā)器等。 sql_statement 限制 除了 SET SHOWPLAN_TEXT 和 SET SHOWPLAN_ALL 之外(這兩個(gè)語句必須是批處理中僅有的語句),任何 SET 語句均可以在存儲(chǔ)過程內(nèi)部指定。所選擇的 SET 選項(xiàng)在存儲(chǔ)過程執(zhí)行過程中有效,之后恢復(fù)為原來的設(shè)置。如果其他用戶要使用某個(gè)存儲(chǔ)過程,那么在該存儲(chǔ)過程內(nèi)部,一些語句使用的對(duì)象名必須使用對(duì)象所有者的名稱限定。這些語句包括: ALTER TABLE CREATE INDEX CREATE TABLE 所有 DB

27、CC 語句 DROP TABLEDROP INDEX TRUNCATE TABLE UPDATE STATISTICS 權(quán)限 CREATE PROCEDURE 的權(quán)限默認(rèn)授予 sysadmin 固定服務(wù)器角色成員和 db_owner 和 db_ddladmin 固定數(shù)據(jù)庫角色成員。sysadmin 固定服務(wù)器角色成員和 db_owner 固定數(shù)據(jù)庫角色成員可以將 CREATE PROCEDURE 權(quán)限轉(zhuǎn)讓給其他用戶。執(zhí)行存儲(chǔ)過程的權(quán)限授予過程的所有者,該所有者可以為其它數(shù)據(jù)庫用戶設(shè)置執(zhí)行權(quán)限。 示例 A. 使用帶有復(fù)雜 SELECT 語句的簡(jiǎn)單過程 下面的存儲(chǔ)過程從四個(gè)表的聯(lián)接中返回所有作者(

28、提供了姓名)、出版的書籍以及出版社。該存儲(chǔ)過程不使用任何參數(shù)。 USE pubs IF EXISTS (SELECT name FROM sysobjects WHERE name = au_info_all AND type = P) DROP PROCEDURE au_info_all GO CREATE PROCEDURE au_info_all AS SELECT au_lname, au_fname, title, pub_name FROM authors a INNER JOIN titleauthor ta ON a.au_id = ta.au_id INNER JOIN ti

29、tles t ON t.title_id = ta.title_id INNER JOIN publishers p ON t.pub_id = p.pub_id GO au_info_all 存儲(chǔ)過程可以通過以下方法執(zhí)行: EXECUTE au_info_all - Or EXEC au_info_all 如果該過程是批處理中的第一條語句,則可使用: au_info_all存儲(chǔ)過程的一些例子:定義一個(gè)帶輸入?yún)?shù)的存儲(chǔ)過程,實(shí)現(xiàn)功能:根據(jù)家鄉(xiāng)、性別、姓氏 查詢學(xué)生信息。要求:3個(gè)參數(shù),其中家鄉(xiāng)、姓氏要求模糊查找,性別默認(rèn)為'男'例如:查詢湖北的,姓王的男同學(xué) 查詢'河南

30、'的,姓馬的女同學(xué)create proc pk_4(jiaxiang varchar(10),xingshi varchar(8),xingbie char(2)='男')as select *from n2d09003 where 家鄉(xiāng) like jiaxiang+'%'and 姓名 like xingshi+'%'and 性別=xingbieexec pk_4 jiaxiang='湖北',xingshi='王'exec pk_4 jiaxiang='河南',xingshi='馬',xingbie='女'定義一個(gè)帶參數(shù)的存儲(chǔ)過程,實(shí)現(xiàn):根據(jù)輸入的編號(hào),修改該學(xué)生姓名。例如:輸入42,'張三' 就把編號(hào)為42的學(xué)生姓名修改為張三alter proc pr(編號(hào) int=42,姓名 char(8)asupdate N2D09003 set 姓名=姓名where 編號(hào)=編號(hào)go-update N2D09003 set 姓名='張三'where 編號(hào)=1exec pr 2,&#

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論