執(zhí)行標(biāo)量值的用戶定義函數(shù)、系統(tǒng)過(guò)程、用戶定義存儲(chǔ)過(guò)程或擴(kuò)展存儲(chǔ)過(guò)程。同時(shí)支持 Transact-SQL 批處理內(nèi)的字符串的執(zhí)行
若要喚醒調(diào)用函數(shù),請(qǐng)使用 EXECUTE stored_procedure 中描述的語(yǔ)法。
執(zhí)行存儲(chǔ)過(guò)程:
[ [ EXEC [ UTE ] ]
{
[ @return_status = ]
{ procedure_name [ ;number ] | @procedure_name_var
}
[ [ @parameter = ] { value | @variable [ OUTPUT ] | [ DEFAULT ] ]
[ ,...n ]
[ WITH RECOMPILE ]
執(zhí)行字符串:
EXEC [ UTE ] (
{ @string_variable | [ N ] 'tsql_string'
} [ + ...n ] )
@return_status
是一個(gè)可選的整型變量,保存存儲(chǔ)過(guò)程的返回狀態(tài)。這個(gè)變量在用于 EXECUTE 語(yǔ)句前,必須在批處理、存儲(chǔ)過(guò)程或函數(shù)中聲明過(guò)。
在用于喚醒調(diào)用標(biāo)量值用戶定義函數(shù)時(shí),@return_status 變量可以是任何標(biāo)量數(shù)據(jù)類(lèi)型。
procedure_name
是擬調(diào)用的存儲(chǔ)過(guò)程的完全合法或者不完全合法的名稱。過(guò)程名稱必須符合標(biāo)識(shí)符規(guī)則。有關(guān)更多信息,請(qǐng)參見(jiàn)使用標(biāo)識(shí)符。無(wú)論服務(wù)器的代碼頁(yè)或排序方式如何,擴(kuò)展存儲(chǔ)過(guò)程的名稱總是區(qū)分大小寫(xiě)。
用戶可以執(zhí)行在另一數(shù)據(jù)庫(kù)中創(chuàng)建的過(guò)程,只要該用戶擁有此過(guò)程或有在該數(shù)據(jù)庫(kù)中執(zhí)行它的適當(dāng)?shù)臋?quán)限。用戶可以在另一臺(tái)運(yùn)行 Microsoft® SQL Server™ 的服務(wù)器上執(zhí)行過(guò)程,只要該用戶有適當(dāng)?shù)臋?quán)限使用該服務(wù)器(遠(yuǎn)程訪問(wèn)),并能在數(shù)據(jù)庫(kù)中執(zhí)行該過(guò)程。如果指定了服務(wù)器名稱但沒(méi)有指定數(shù)據(jù)庫(kù)名稱,SQL Server 會(huì)在用戶默認(rèn)的數(shù)據(jù)庫(kù)中尋找該過(guò)程。
;number
是可選的整數(shù),用于將相同名稱的過(guò)程進(jìn)行組合,使得它們可以用一句 DROP PROCEDURE 語(yǔ)句除去。該參數(shù)不能用于擴(kuò)展存儲(chǔ)過(guò)程。
在同一應(yīng)用程序中使用的過(guò)程一般都以該方式組合。例如,在訂購(gòu)應(yīng)用程序中使用的過(guò)程可以 orderproc;1、orderproc;2 等來(lái)命名。DROP PROCEDURE orderproc 語(yǔ)句將除去整個(gè)組。在對(duì)過(guò)程分組后,不能除去組中的單個(gè)過(guò)程。例如,DROP PROCEDURE orderproc;2 是不允許的。有關(guān)過(guò)程組的更多信息,請(qǐng)參見(jiàn) CREATE PROCEDURE。
@procedure_name_var
是局部定義變量名,代表存儲(chǔ)過(guò)程名稱。
@parameter
是過(guò)程參數(shù),在 CREATE PROCEDURE 語(yǔ)句中定義。參數(shù)名稱前必須加上符號(hào) (@)。在以 @parameter_name = value 格式使用時(shí),參數(shù)名稱和常量不一定按照 CREATE PROCEDURE 語(yǔ)句中定義的順序出現(xiàn)。但是,如果有一個(gè)參數(shù)使用 @parameter_name = value 格式,則其它所有參數(shù)都必須使用這種格式。
默認(rèn)情況下,參數(shù)可為空。如果傳遞 NULL 參數(shù)值,且該參數(shù)用于 CREATE 或 ALTER TABLE 語(yǔ)句中不允許為 NULL 的列(例如,插入至不允許為 NULL 的列),SQL Server 就會(huì)報(bào)錯(cuò)。為避免將 NULL 參數(shù)值傳遞給不允許為 NULL 的列,可以在過(guò)程中添加程序設(shè)計(jì)邏輯或采用默認(rèn)值(使用 CREATE 或 ALTER TABLE 語(yǔ)句中的 DEFAULT 關(guān)鍵字)。
value
是過(guò)程中參數(shù)的值。如果參數(shù)名稱沒(méi)有指定,參數(shù)值必須以 CREATE PROCEDURE 語(yǔ)句中定義的順序給出。
如果參數(shù)值是一個(gè)對(duì)象名稱、字符串或通過(guò)數(shù)據(jù)庫(kù)名稱或所有者名稱進(jìn)行限制,則整個(gè)名稱必須用單引號(hào)括起來(lái)。如果參數(shù)值是一個(gè)關(guān)鍵字,則該關(guān)鍵字必須用雙引號(hào)括起來(lái)。
如果在 CREATE PROCEDURE 語(yǔ)句中定義了默認(rèn)值,用戶執(zhí)行該過(guò)程時(shí)可以不必指定參數(shù)。如果該過(guò)程使用了帶 LIKE 關(guān)鍵字的參數(shù)名稱,則默認(rèn)值必須是常量,并且可以包含 %、_、[ ] 及 [^] 通配符。
默認(rèn)值也可以為 NULL。通常,過(guò)程定義會(huì)指定當(dāng)參數(shù)值為 NULL 時(shí)應(yīng)該執(zhí)行的操作。
@variable
是用來(lái)保存參數(shù)或者返回參數(shù)的變量。
OUTPUT
指定存儲(chǔ)過(guò)程必須返回一個(gè)參數(shù)。該存儲(chǔ)過(guò)程的匹配參數(shù)也必須由關(guān)鍵字 OUTPUT 創(chuàng)建。使用游標(biāo)變量作參數(shù)時(shí)使用該關(guān)鍵字。
如果使用 OUTPUT 參數(shù),目的是在調(diào)用批處理或過(guò)程的其它語(yǔ)句中使用其返回值,則參數(shù)值必須作為變量傳遞(即 @parameter = @variable)。如果一個(gè)參數(shù)在 CREATE PROCEDURE 語(yǔ)句中不是定義為 OUTPUT 參數(shù),則對(duì)該參數(shù)指定 OUTPUT 的過(guò)程不能執(zhí)行。不能使用 OUTPUT 將常量傳遞給存儲(chǔ)過(guò)程;返回參數(shù)需要變量名稱。在執(zhí)行過(guò)程之前,必須聲明變量的數(shù)據(jù)類(lèi)型并賦值。返回參數(shù)可以是 text 或 image 數(shù)據(jù)類(lèi)型以外的任意數(shù)據(jù)類(lèi)型。
DEFAULT
根據(jù)過(guò)程的定義,提供參數(shù)的默認(rèn)值。當(dāng)過(guò)程需要的參數(shù)值沒(méi)有事先定義好的默認(rèn)值,或缺少參數(shù),或指定了 DEFAULT 關(guān)鍵字,就會(huì)出錯(cuò)。
n
是占位符,表示在它前面的項(xiàng)目可以多次重復(fù)執(zhí)行。例如,EXECUTE 語(yǔ)句可以指定一個(gè)或者多個(gè) @parameter、value 或 @variable。
WITH RECOMPILE
強(qiáng)制編譯新的計(jì)劃。如果所提供的參數(shù)為非典型參數(shù)或者數(shù)據(jù)有很大的改變,使用該選項(xiàng)。在以后的程序執(zhí)行中使用更改過(guò)的計(jì)劃。該選項(xiàng)不能用于擴(kuò)展存儲(chǔ)過(guò)程。建議盡量少使用該選項(xiàng),因?yàn)樗妮^多系統(tǒng)資源。
@string_variable
是局部變量的名稱。@string_variable 可以是 char、varchar、nchar 或 nvarchar 數(shù)據(jù)類(lèi)型,最大值為服務(wù)器的可用內(nèi)存。如果字符串長(zhǎng)度超過(guò) 4,000 個(gè)字符,則把多個(gè)局部變量串聯(lián)起來(lái)用于 EXECUTE 字符串。有關(guān)系統(tǒng)提供的 SQL Server 數(shù)據(jù)類(lèi)型更多的信息,請(qǐng)參見(jiàn)數(shù)據(jù)類(lèi)型。
[N]'tsql_string'
是一個(gè)常量,tsql_string 可以是 nvarchar 或 varchar 數(shù)據(jù)類(lèi)型。如果包含 N,則該字符串將解釋為 nvarchar 數(shù)據(jù)類(lèi)型,最大值為服務(wù)器的可用內(nèi)存。如果字符串長(zhǎng)度超過(guò) 4,000 個(gè)字符,則把多個(gè)局部變量串聯(lián)起來(lái)用于 EXECUTE 字符串。
如果過(guò)程名稱的前三個(gè)字符為 sp_,SQL Server 會(huì)在 Master 數(shù)據(jù)庫(kù)中尋找該過(guò)程。如果沒(méi)能找到合法的過(guò)程名稱,SQL Server 會(huì)尋找所有者名稱為 dbo 的過(guò)程。若要將存儲(chǔ)過(guò)程名稱解析為與系統(tǒng)存儲(chǔ)過(guò)程同名的用戶定義存儲(chǔ)過(guò)程,請(qǐng)?zhí)峁┮粋€(gè)完全合法的過(guò)程名稱。
參數(shù)可以通過(guò)利用 value 或 @parameter_name = value 來(lái)提供。參數(shù)不是事務(wù)的一個(gè)部分;因而如果事務(wù)中的參數(shù)值更改,且該事務(wù)在以后回滾,該參數(shù)值不會(huì)退回到以前的值。返回給調(diào)用方的值總是過(guò)程返回時(shí)的值。
當(dāng)一個(gè)存儲(chǔ)過(guò)程調(diào)用另一個(gè)存儲(chǔ)過(guò)程時(shí),會(huì)產(chǎn)生嵌套。當(dāng)調(diào)用的過(guò)程開(kāi)始執(zhí)行時(shí),嵌套級(jí)會(huì)增加,當(dāng)調(diào)用過(guò)程執(zhí)行結(jié)束時(shí),嵌套級(jí)則會(huì)減少。嵌套級(jí)最高為32級(jí),超過(guò)32級(jí)時(shí),會(huì)導(dǎo)致整個(gè)調(diào)用過(guò)程鏈?zhǔn)?。?dāng)前的嵌套級(jí)存儲(chǔ)在 @@NESTLEVEL 函數(shù)中。
SQL Server 目前使用返回值 0 到 -14 來(lái)表示存儲(chǔ)過(guò)程的執(zhí)行狀態(tài)。值 15 到 -99 留作后用。有關(guān)保留的返回狀態(tài)值的列表的更多信息,請(qǐng)參見(jiàn) RETURN。
因?yàn)檫h(yuǎn)程存儲(chǔ)過(guò)程和擴(kuò)展存儲(chǔ)過(guò)程不在事務(wù)的作用域中(除非在 BEGIN DISTRIBUTED TRANSACTION 語(yǔ)句中發(fā)出或者是和不同的配置選項(xiàng)一起使用),所以通過(guò)調(diào)用執(zhí)行的命令不能回滾。有關(guān)更多信息,請(qǐng)參見(jiàn)系統(tǒng)存儲(chǔ)過(guò)程和 BEGIN DISTRIBUTED TRANSACTION。
當(dāng)使用游標(biāo)變量時(shí),如果執(zhí)行的過(guò)程傳遞一個(gè)分配有游標(biāo)的游標(biāo)變量,就會(huì)出錯(cuò)。
在執(zhí)行存儲(chǔ)過(guò)程時(shí),如果語(yǔ)句是批處理中的第一個(gè)語(yǔ)句,則不一定要指定 EXECUTE 關(guān)鍵字。
使用字符串串聯(lián)運(yùn)算符 (+) 為動(dòng)態(tài)執(zhí)行創(chuàng)建長(zhǎng)字符串。每個(gè)字符串表達(dá)式可以是 Unicode 與 non-Unicode 數(shù)據(jù)類(lèi)型的混合。
盡管每個(gè) [N] 'tsql_string' 或 @string_variable 不得超過(guò) 8,000 個(gè)字節(jié),SQL Server 語(yǔ)法分析器中對(duì)這種串聯(lián)只進(jìn)行邏輯處理而不占用物理內(nèi)存。例如,該語(yǔ)句決不會(huì)生成長(zhǎng) 16,000 個(gè)串聯(lián)起來(lái)的字符串:
EXEC('name_of_8000_char_string' + 'another_name_of_8000_char_string')
在 EXECUTE 語(yǔ)句執(zhí)行前,不會(huì)編譯 EXECUTE 語(yǔ)句內(nèi)的語(yǔ)句。
數(shù)據(jù)庫(kù)環(huán)境的更改只在 EXECUTE 語(yǔ)句結(jié)束前有效。例如,在這個(gè)例子的 EXEC 后,數(shù)據(jù)庫(kù)環(huán)境是 master:
USE master EXEC ("USE pubs") SELECT * FROM authors
存儲(chǔ)過(guò)程的 EXECUTE 權(quán)限默認(rèn)給該存儲(chǔ)過(guò)程的所有者,該所有者可以將此權(quán)限轉(zhuǎn)讓給其他用戶。當(dāng)遇到 EXECUTE 語(yǔ)句時(shí),即使 EXECUTE 語(yǔ)句是在存儲(chǔ)過(guò)程中,也會(huì)檢查在 EXECUTE 字符串內(nèi)使用該語(yǔ)句的權(quán)限。當(dāng)運(yùn)行一個(gè)執(zhí)行字符串的存儲(chǔ)過(guò)程時(shí),系統(tǒng)會(huì)在執(zhí)行該過(guò)程的用戶環(huán)境中,而不是在創(chuàng)建該過(guò)程的用戶環(huán)境中檢查權(quán)限。但是,如果某用戶擁有兩個(gè)存儲(chǔ)過(guò)程,并且第一個(gè)過(guò)程調(diào)用第二個(gè)過(guò)程,則在第二個(gè)過(guò)程中不進(jìn)行 EXECUTE 權(quán)限檢查。
showind 存儲(chǔ)過(guò)程需要參數(shù) (@tabname),它是一個(gè)表的名稱。下面這個(gè)例子執(zhí)行 showind 存儲(chǔ)過(guò)程,以 titles 為參數(shù)值。
說(shuō)明 showind 存儲(chǔ)過(guò)程只是用來(lái)作為一個(gè)例子,pubs 數(shù)據(jù)庫(kù)并沒(méi)有此過(guò)程。
EXEC showind titles
在執(zhí)行過(guò)程中變量可以顯式命名:
EXEC showind @tabname = titles
如果這是 isql 腳本或批處理中第一個(gè)語(yǔ)句,則 EXEC 語(yǔ)句可以省略:
showind titles
-或-
showind @tabname = titles
這個(gè)例子執(zhí)行 roy_check 存儲(chǔ)過(guò)程,傳遞三個(gè)參數(shù)。第三個(gè)參數(shù) @pc 是輸出參數(shù)。過(guò)程執(zhí)行完后,返回變量可以從變量 @percent 得到。
說(shuō)明 roy_check 存儲(chǔ)過(guò)程只是用作舉例,pubs 數(shù)據(jù)庫(kù)中并沒(méi)有此過(guò)程。
DECLARE @percent int
EXECUTE roy_check 'BU1032', 1050, @pc = @percent OUTPUT
SET Percent = @percent
這個(gè)例子顯示 EXECUTE 語(yǔ)句如何處理動(dòng)態(tài)生成的、含有變量的字符串。這個(gè)例子創(chuàng)建 tables_cursor 游標(biāo)來(lái)保存所有用戶定義表 (type = U) 的列表。
說(shuō)明 此例子只用作舉例。
DECLARE tables_cursor CURSOR
FOR
SELECT name FROM sysobjects WHERE type = 'U'
OPEN tables_cursor
DECLARE @tablename sysname
FETCH NEXT FROM tables_cursor INTO @tablename
WHILE (@@FETCH_STATUS <> -1)
BEGIN
/* A @@FETCH_STATUS of -2 means that the row has been deleted.
There is no need to test for this because this loop drops all
user-defined tables. */.
EXEC ('DROP TABLE ' + @tablename)
FETCH NEXT FROM tables_cursor INTO @tablename
END
PRINT 'All user-defined tables have been dropped from the database.'
DEALLOCATE tables_cursor
這個(gè)例子在遠(yuǎn)程服務(wù)器 SQLSERVER1 上執(zhí)行 checkcontract 存儲(chǔ)過(guò)程,在 @retstat 中保存返回狀態(tài),說(shuō)明運(yùn)行成功或失敗。
DECLARE @retstat int
EXECUTE @retstat = SQLSERVER1.pubs.dbo.checkcontract '409-56-4008'
下例使用 xp_cmdshell 擴(kuò)展存儲(chǔ)過(guò)程列出文件擴(kuò)展名為 .exe 的所有文件的目錄。
USE master
EXECUTE xp_cmdshell 'dir *.exe'
這個(gè)例子創(chuàng)建一個(gè)代表存儲(chǔ)過(guò)程名稱的變量。
DECLARE @proc_name varchar(30)
SET @proc_name = 'sp_who'
EXEC @proc_name
這個(gè)例子創(chuàng)建了一個(gè)存儲(chǔ)過(guò)程,過(guò)程中第一個(gè)和第三個(gè)參數(shù)為默認(rèn)值。當(dāng)運(yùn)行該過(guò)程時(shí),如果調(diào)用時(shí)沒(méi)有傳遞值或者指定了默認(rèn)值,這些默認(rèn)值就會(huì)賦給第一個(gè)和第三個(gè)參數(shù)。注意 DEFAULT 關(guān)鍵字有多種使用方法。
USE pubs
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'proc_calculate_taxes' AND type = 'P')
DROP PROCEDURE proc_calculate_taxes
GO
-- Create the stored procedure.
CREATE PROCEDURE proc_calculate_taxes (@p1 smallint = 42, @p2 char(1),
@p3 varchar(8) = 'CAR')
AS
SELECT *
FROM mytable
proc_calculate_taxes 存儲(chǔ)過(guò)程可以以多種組合方式執(zhí)行:
相關(guān)文章EXECUTE proc_calculate_taxes @p2 = 'A'
EXECUTE proc_calculate_taxes 69, 'B'
EXECUTE proc_calculate_taxes 69, 'C', 'House'
EXECUTE proc_calculate_taxes @p1 = DEFAULT, @p2 = 'D'
EXECUTE proc_calculate_taxes DEFAULT, @p3 = 'Local', @p2 = 'E'
EXECUTE proc_calculate_taxes 69, 'F', @p3 = DEFAULT
EXECUTE proc_calculate_taxes 95, 'G', DEFAULT
EXECUTE proc_calculate_taxes DEFAULT, 'H', DEFAULT
EXECUTE proc_calculate_taxes DEFAULT, 'I', @p3 = DEFAULT