好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識(shí)庫 > SQL 存儲(chǔ)過程基礎(chǔ)語法之一

SQL 存儲(chǔ)過程基礎(chǔ)語法之一

熱門標(biāo)簽:小e電話機(jī)器人 臨沂智能電銷機(jī)器人加盟哪家好 鎮(zhèn)江網(wǎng)路外呼系統(tǒng)供應(yīng)商 貴州房產(chǎn)智能外呼系統(tǒng)供應(yīng)商 一個(gè)導(dǎo)航軟件能用幾個(gè)地圖標(biāo)注點(diǎn) 外呼運(yùn)營商線路收費(fèi) 申請(qǐng)400電話在哪辦理流程 百度地圖標(biāo)注改顏色 電銷外呼有錄音系統(tǒng)有哪些
CREATE PROCEDURE
創(chuàng)建存儲(chǔ)過程,存儲(chǔ)過程是保存起來的可以接受和返回用戶提供的參數(shù)的 Transact-SQL 語句的集合。
可以創(chuàng)建一個(gè)過程供永久使用,或在一個(gè)會(huì)話中臨時(shí)使用(局部臨時(shí)過程),或在所有會(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ù)庫及其所有者必須唯一。有關(guān)更多信息,請(qǐng)參見使用標(biāo)識(shí)符。
要?jiǎng)?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 語句將除去整個(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ì)象的名稱。有關(guān)更多信息,請(qǐng)參見 EXECUTE。
data_type
參數(shù)的數(shù)據(jù)類型。所有數(shù)據(jù)類型(包括 text、ntext 和 image)均可以用作存儲(chǔ)過程的參數(shù)。不過,cursor 數(shù)據(jù)類型只能用于 OUTPUT 參數(shù)。如果指定的數(shù)據(jù)類型為 cursor,也必須同時(shí)指定 VARYING 和 OUTPUT 關(guān)鍵字。有關(guān) SQL Server 提供的數(shù)據(jù)類型及其語法的更多信息,請(qǐng)參見數(shù)據(jù)類型。
說明 對(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)值中可以包含通配符(%、_、[] 和 [^])。
OUTPUT
表明參數(shù)是返回參數(shù)。該選項(xiàng)的值可以返回給 EXEC[UTE]。使用 OUTPUT 參數(shù)可將信息返回給調(diào)用過程。Text、ntext 和 image 參數(shù)可用作 OUTPUT 參數(shù)。使用 OUTPUT 關(guān)鍵字的輸出參數(shù)可以是游標(biāo)占位符。

表示最多可以指定 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)。
ENCRYPTION 表示 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í)行的操作。
sql_statement
過程中要包含的任意數(shù)目和類型的 Transact-SQL 語句。但有一些限制。

是表示此過程可以包含多條 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 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 語句中沒有指定的話)。如果某個(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 QUOTED_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í)別設(shè)置控制。如果兼容級(jí)別小于或等于 65,SQL Server 就將空字符串解釋為單個(gè)空格。如果兼容級(jí)別等于 70,則 SQL Server 將空字符串解釋為空字符串。有關(guān)更多信息,請(qǐng)參見 sp_dbcmptlevel。
獲得有關(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)行語法檢查。執(zhí)行時(shí),如果高速緩存中尚無有效的計(jì)劃,則編譯存儲(chǔ)過程以生成執(zhí)行計(jì)劃。只有在編譯過程中才解析存儲(chǔ)過程中引用的所有對(duì)象。因此,如果語法正確的存儲(chǔ)過程引用了不存在的對(duì)象,則仍可以成功創(chuàng)建,但在運(yùn)行時(shí)將失敗,因?yàn)樗玫膶?duì)象不存在。有關(guān)更多信息,請(qǐng)參見延遲名稱解析和編譯。

延遲名稱解析和兼容級(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ò)誤信息。有關(guān)更多信息,請(qǐng)參見 sp_dbcmptlevel 和延遲名稱解析和編譯。

執(zhí)行存儲(chǔ)過程
成功執(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ù)庫 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)位置的行,例如:
在過程中的名為 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ā)器。返回時(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)建該過程的會(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ù),因此可以避免這一問題。

自動(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)記),則啟動(dòng)存儲(chǔ)過程也不會(huì)執(zhí)行。有關(guān)更多信息,請(qǐng)參見跟蹤標(biāo)記。
若要?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)使用下列性能監(jiān)視計(jì)數(shù)器。
性能監(jiān)視器對(duì)象名 性能監(jiān)視計(jì)數(shù)器名稱
SQLServer:緩沖區(qū)管理器 高速緩存大小(頁面數(shù))
SQLServer:高速緩存管理器 高速緩存命中率
高速緩存頁
高速緩存對(duì)象計(jì)數(shù)*
* 各種分類的高速緩存對(duì)象均可以使用這些計(jì)數(shù)器,包括特殊 sql、準(zhǔn)備 sql、過程、觸發(fā)器等。
有關(guān)更多信息,請(qǐng)參見 SQL Server:Buffer Manager 對(duì)象和 SQL Server:Cache Manager 對(duì)象。

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
所有 DBCC 語句
DROP TABLE
DROP 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 語句的簡單過程
下面的存儲(chǔ)過程從四個(gè)表的聯(lián)接中返回所有作者(提供了姓名)、出版的書籍以及出版社。該存儲(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 titles 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
B. 使用帶有參數(shù)的簡單過程
下面的存儲(chǔ)過程從四個(gè)表的聯(lián)接中只返回指定的作者(提供了姓名)、出版的書籍以及出版社。該存儲(chǔ)過程接受與傳遞的參數(shù)精確匹配的值。
USE pubs
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'au_info' AND type = 'P')
DROP PROCEDURE au_info
GO
USE pubs
GO
CREATE PROCEDURE au_info
@lastname varchar(40),
@firstname varchar(20)
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 titles t
ON t.title_id = ta.title_id INNER JOIN publishers p
ON t.pub_id = p.pub_id
WHERE au_fname = @firstname
AND au_lname = @lastname
GO
au_info 存儲(chǔ)過程可以通過以下方法執(zhí)行:
EXECUTE au_info 'Dull', 'Ann'
-- Or
EXECUTE au_info @lastname = 'Dull', @firstname = 'Ann'
-- Or
EXECUTE au_info @firstname = 'Ann', @lastname = 'Dull'
-- Or
EXEC au_info 'Dull', 'Ann'
-- Or
EXEC au_info @lastname = 'Dull', @firstname = 'Ann'
-- Or
EXEC au_info @firstname = 'Ann', @lastname = 'Dull'
如果該過程是批處理中的第一條語句,則可使用:
au_info 'Dull', 'Ann'
-- Or
au_info @lastname = 'Dull', @firstname = 'Ann'
-- Or
au_info @firstname = 'Ann', @lastname = 'Dull'
C. 使用帶有通配符參數(shù)的簡單過程
下面的存儲(chǔ)過程從四個(gè)表的聯(lián)接中只返回指定的作者(提供了姓名)、出版的書籍以及出版社。該存儲(chǔ)過程對(duì)傳遞的參數(shù)進(jìn)行模式匹配,如果沒有提供參數(shù),則使用預(yù)設(shè)的默認(rèn)值。
USE pubs
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'au_info2' AND type = 'P')
DROP PROCEDURE au_info2
GO
USE pubs
GO
CREATE PROCEDURE au_info2
@lastname varchar(30) = 'D%',
@firstname varchar(18) = '%'
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 titles t
ON t.title_id = ta.title_id INNER JOIN publishers p
ON t.pub_id = p.pub_id
WHERE au_fname LIKE @firstname
AND au_lname LIKE @lastname
GO
au_info2 存儲(chǔ)過程可以用多種組合執(zhí)行。下面只列出了部分組合:
EXECUTE au_info2
-- Or
EXECUTE au_info2 'Wh%'
-- Or
EXECUTE au_info2 @firstname = 'A%'
-- Or
EXECUTE au_info2 '[CK]ars[OE]n'
-- Or
EXECUTE au_info2 'Hunter', 'Sheryl'
-- Or
EXECUTE au_info2 'H%', 'S%'
D. 使用 OUTPUT 參數(shù)
OUTPUT 參數(shù)允許外部過程、批處理或多條 Transact-SQL 語句訪問在過程執(zhí)行期間設(shè)置的某個(gè)值。下面的示例創(chuàng)建一個(gè)存儲(chǔ)過程 (titles_sum),并使用一個(gè)可選的輸入?yún)?shù)和一個(gè)輸出參數(shù)。
首先,創(chuàng)建過程:
USE pubs
GO
IF EXISTS(SELECT name FROM sysobjects
WHERE name = 'titles_sum' AND type = 'P')
DROP PROCEDURE titles_sum
GO
USE pubs
GO
CREATE PROCEDURE titles_sum @@TITLE varchar(40) = '%', @@SUM money OUTPUT
AS
SELECT 'Title Name' = title
FROM titles
WHERE title LIKE @@TITLE
SELECT @@SUM = SUM(price)
FROM titles
WHERE title LIKE @@TITLE
GO
接下來,將該 OUTPUT 參數(shù)用于控制流語言
說明 OUTPUT 變量必須在創(chuàng)建表和使用該變量時(shí)都進(jìn)行定義。
參數(shù)名和變量名不一定要匹配,不過數(shù)據(jù)類型和參數(shù)位置必須匹配(除非使用 @@SUM = variable 形式)。
DECLARE @@TOTALCOST money
EXECUTE titles_sum 'The%', @@TOTALCOST OUTPUT
IF @@TOTALCOST 200
BEGIN
PRINT ' '
PRINT 'All of these titles can be purchased for less than $200.'
END
ELSE
SELECT 'The total cost of these titles is $' + RTRIM(CAST(@@TOTALCOST AS varchar(20)))
下面是結(jié)果集:
Title Name
------------------------------------------------------------------------
The Busy Executive's Database Guide
The Gourmet Microwave
The Psychology of Computer Cooking
(3 row(s) affected)
Warning, null value eliminated from aggregate.
All of these titles can be purchased for less than $200.
E. 使用 OUTPUT 游標(biāo)參數(shù)
OUTPUT 游標(biāo)參數(shù)用來將存儲(chǔ)過程的局部游標(biāo)傳遞回調(diào)用批處理、存儲(chǔ)過程或觸發(fā)器。
首先,創(chuàng)建以下過程,在 titles 表上聲明并打開一個(gè)游標(biāo):
USE pubs
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'titles_cursor' and type = 'P')
DROP PROCEDURE titles_cursor
GO
CREATE PROCEDURE titles_cursor @titles_cursor CURSOR VARYING OUTPUT
AS
SET @titles_cursor = CURSOR
FORWARD_ONLY STATIC FOR
SELECT * FROM titles
OPEN @titles_cursor
GO
接下來,執(zhí)行一個(gè)批處理,聲明一個(gè)局部游標(biāo)變量,執(zhí)行上述過程以將游標(biāo)賦值給局部變量,然后從該游標(biāo)提取行。
USE pubs
GO
DECLARE @MyCursor CURSOR
EXEC titles_cursor @titles_cursor = @MyCursor OUTPUT
WHILE (@@FETCH_STATUS = 0)
BEGIN
FETCH NEXT FROM @MyCursor
END
CLOSE @MyCursor
DEALLOCATE @MyCursor
GO
F. 使用 WITH RECOMPILE 選項(xiàng)
如果為過程提供的參數(shù)不是典型的參數(shù),并且新的執(zhí)行計(jì)劃不應(yīng)高速緩存或存儲(chǔ)在內(nèi)存中,WITH RECOMPILE 子句會(huì)很有幫助。
USE pubs
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'titles_by_author' AND type = 'P')
DROP PROCEDURE titles_by_author
GO
CREATE PROCEDURE titles_by_author @@LNAME_PATTERN varchar(30) = '%'
WITH RECOMPILE
AS
SELECT RTRIM(au_fname) + ' ' + RTRIM(au_lname) AS 'Authors full name',
title AS Title
FROM authors a INNER JOIN titleauthor ta
ON a.au_id = ta.au_id INNER JOIN titles t
ON ta.title_id = t.title_id
WHERE au_lname LIKE @@LNAME_PATTERN
GO
G. 使用 WITH ENCRYPTION 選項(xiàng)
WITH ENCRYPTION 子句對(duì)用戶隱藏存儲(chǔ)過程的文本。下例創(chuàng)建加密過程,使用 sp_helptext 系統(tǒng)存儲(chǔ)過程獲取關(guān)于加密過程的信息,然后嘗試直接從 syscomments 表中獲取關(guān)于該過程的信息。
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'encrypt_this' AND type = 'P')
DROP PROCEDURE encrypt_this
GO
USE pubs
GO
CREATE PROCEDURE encrypt_this
WITH ENCRYPTION
AS
SELECT * FROM authors
GO
EXEC sp_helptext encrypt_this
下面是結(jié)果集:
The object's comments have been encrypted.
接下來,選擇加密存儲(chǔ)過程內(nèi)容的標(biāo)識(shí)號(hào)和文本。
SELECT c.id, c.text FROM syscomments c INNER JOIN sysobjects o ON c.id = o.id WHERE o.name = 'encrypt_this'

標(biāo)簽:延邊 合肥 三明 澳門 嘉興 保定 晉城 日照

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《SQL 存儲(chǔ)過程基礎(chǔ)語法之一》,本文關(guān)鍵詞  SQL,存儲(chǔ),過程,基礎(chǔ),語法,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《SQL 存儲(chǔ)過程基礎(chǔ)語法之一》相關(guān)的同類信息!
  • 本頁收集關(guān)于SQL 存儲(chǔ)過程基礎(chǔ)語法之一的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章