執行預存程序 (Database Engine)

若要執行預存程序,請使用 Transact-SQL EXECUTE 陳述式。如果預存程序是批次中的第一個陳述式,則執行預存程序時也可以不用 EXECUTE 關鍵字。

執行系統預存程序

sp_ 字元開頭的系統預存程序。它們實際上是儲存在 Resource 資料庫中,但在邏輯上會出現在 SQL Server 執行個體中每個系統和使用者定義資料庫的 sys 結構描述中。系統預存程序可以從任何資料庫中執行,不必完整限定預存程序的名稱。非結構描述合格的名稱若不是單部分名稱 (如 sp_someproc),就是第二部分 (結構描述名稱) 未指定的三部分名稱 (如 somedb..sp_someproc)。

我們建議您以結構描述名稱 sys 限定所有的系統預存程序名稱,以避免名稱衝突。下列範例示範執行系統預存程序的建議方法。

EXEC sys.sp_who;

下列範例示範執行系統預存程序的回溯相容方法。

[!附註]

下列執行系統預存程序的方法將在未來的 SQL Server 版本中移除。避免在新開發工作中使用這些方法,並計畫修改目前使用它們的應用程式。

EXEC sp_who;
EXEC master.dbo.sp_who;
EXEC mydatabase..sp_who;
EXEC dbo.sp_who;
EXEC mydatabase.dbo.sp_who;

資料庫定序配對

SQL Server 2008 會在與系統程序名稱相符時,使用呼叫資料庫定序。因此,您應該在應用程式中使用大小寫完全相符的系統程序名稱。例如,此程式碼如果在有區分大小寫定序的資料庫內容中執行將會失敗:

exec SP_heLP; -- Will fail to resolve because SP_heLP does not equal sp_help 

使用 sys.system_objectssys.system_parameters 目錄檢視來顯示完全相符的系統預存程序名稱。

執行系統擴充預存程序

xp_ 字元開頭的系統擴充預存程序。它們實際上是儲存在 Resource 資料庫中,但在邏輯上會出現在 SQL Server 執行個體中每個系統和使用者自訂資料庫的 sys 結構描述中。下列範例示範執行系統擴充預存程序的建議方法。

EXEC sys.xp_subdirs 'c:\';

執行使用者自訂預存程序

在執行使用者自訂預存程序時 (在批次中或者在如使用者自訂預存程序或函數的模組內),我們強烈建議至少使用結構描述名稱來限定預存程序的名稱。

下列範例示範執行使用者自訂預存程序的建議方法。

USE AdventureWorks;
GO
EXEC dbo.uspGetEmployeeManagers 50;

- 或 -

EXEC AdventureWorks.dbo.uspGetEmployeeManagers 50;
GO

如果指定的是非限定使用者自訂預存程序,則 Database Engine 會以下列順序搜尋該程序:

  • 目前資料庫的 sys 結構描述。

  • 如果在批次或動態 SQL 中執行,則為呼叫端的預設結構描述。或如果非合格的程序名稱出現在其他程序定義的主體內,則接下來會掃描包含此其他程序的結構描述。如需有關預設結構描述的詳細資訊,請參閱<使用者結構描述隔離>。

  • 目前資料庫的 dbo 結構描述。

重要注意事項重要事項

如果使用者建立的任何預存程序與系統預存程序同名,而您使用非結構描述合格的名稱參照,就絕對不會執行到使用者建立的預存程序。如需詳細資訊,請參閱<建立預存程序 (Database Engine)>。

指定參數

若要寫入預存程序來接受參數值,則可以提供參數值。

提供的值必須為常數或變數,您無法將函數名稱指定為參數值。變數可以是使用者自訂變數或系統變數,如 @@spid。

下列範例示範傳遞參數值至 uspGetWhereUsedProductID 預存程序。該程序應有兩個輸入參數的值:產品 ID 和日期。下列範例顯示如何以常數和變數傳遞參數,以及如何使用變數傳遞函數值。

USE AdventureWorks;
GO
-- Passing values as constants.
EXEC dbo.uspGetWhereUsedProductID 819, '20050225';
GO
-- Passing values as variables.
DECLARE @ProductID int, @CheckDate datetime;
SET @ProductID = 819;
SET @CheckDate = '20050225';
EXEC dbo.uspGetWhereUsedProductID @ProductID, @CheckDate;
GO
-- Try to use a function as a parameter value.
-- This produces an error message.
EXEC dbo.uspGetWhereUsedProductID 819, GETDATE();
GO
-- Passing the function value as a variable.
DECLARE @CheckDate datetime;
SET @CheckDate = GETDATE();
EXEC dbo.uspGetWhereUsedProductID 819, @CheckDate;
GO

如果您要指定參數,但是指定的順序與預存程序定義的順序不同,則必須為這些參數命名。如需詳細資訊,請參閱<指定參數名稱>。

若要指定參數必須將值傳回至呼叫程式,請使用 OUTPUT 關鍵字。如需詳細資訊,請參閱<指定參數的方向>。

指定參數的順序

如果您以 **@parameter =**value 的形式提供參數,則可以使用任何順序來提供它們。您也可以對已提供預設值的參數省略參數。如果您以 **@parameter =**value 的形式提供一個參數,您必須按照此方式來提供所有後續的參數。如果您不是以 **@parameter =**value 的形式提供參數,您必須依照 CREATE PROCEDURE 陳述式指定的順序來提供它們。

執行預存程序時,伺服器會將程序建立過程中不包含在參數清單中的任何參數駁回。如果參數名稱不相符的話,不接受以傳址方式 (明確傳送參數名稱) 傳送的任何參數。

在參數中使用預設值

雖然可以省略已提供預設值的參數,但只能截斷參數清單。例如,如果預存程序有五個參數,您可以同時省略第四、五個參數,但不能只省略第四個參數,卻要包含第五個參數,除非是以 **@parameter =**value 形式提供參數。

如果預存程序中為參數定義了預設值,則在下列時機會使用參數預設值:

  • 執行預存程序時未指定參數值。

  • 指定 DEFAULT 關鍵字作為參數值。