共用方式為


呼叫預存程序

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)

SQL Server Native Client ODBC 驅動程式同時支援 ODBC CALL 逸出序列和 Transact-SQLEXECUTE語句來執行預存程式;ODBC CALL 逸出序列是慣用的方法。 使用 ODBC 語法可讓應用程式擷取預存程式的傳回碼,而SQL Server Native Client ODBC 驅動程式也經過優化,以使用原本用來傳送遠端程式 (RPC) 呼叫的電腦之間執行SQL Server的通訊協定。 此 RPC 通訊協定會排除在伺服器上完成的許多參數處理與陳述式剖析,藉以增加效能。

注意

使用具名參數搭配 ODBC (呼叫SQL Server預存程式時,請參閱依名稱系結參數 (具名參數) ) ,參數名稱必須以 '@' 字元開頭。 這是 SQL Server 特定限制。 SQL Server Native Client ODBC 驅動程式會比 MDAC) (Microsoft Data Access Components 更嚴格地強制執行這項限制。

用來呼叫程序的 ODBC CALL 逸出序列為:

{[?=]callprocedure_name[ ([parameter][[parameter]]...) ]}

其中 procedure_name 指定程式的名稱,而 參數 會指定程式參數。 只有使用 ODBC CALL 逸出序列的陳述式才會支援具名參數。

程序可以有零或多個參數。 它也可以傳回值 (如語法開頭的選用參數標記 ?= 所指示)。 如果參數是輸入參數或輸入/輸出參數,則可以是常值或參數標記。 如果參數是輸出參數,它必須是參數標記,因為輸出不明。 參數標記必須先與 SQLBindParameter 繫結,才能執行程序呼叫陳述式。

輸入和輸入/輸出參數可以從程序呼叫省略。 如果呼叫包含括號但沒有任何參數的程序,驅動程式會引導資料來源使用第一個參數的預設值。 例如:

{呼叫procedure_name ( ) }

如果程序沒有任何參數,該程序可能會失敗。 如果呼叫沒有括號的程序,驅動程式不會傳送任何參數值。 例如:

{callprocedure_name}

在程序呼叫中可以針對輸入和輸入/輸出參數指定常值。 例如,程序 InsertOrder 有五個輸入參數。 以下對 InsertOrder 的呼叫會省略第一個參數、提供第二個參數的常值,然後將參數標記用於第三、第四和第五個參數 (參數會循序編號,從 1 這個值開始)。

{call InsertOrder(, 10, ?, ?, ?)}  

請注意,如果省略了某個參數,將它與其他參數分隔的逗號仍然必須出現。 如果省略了輸入或輸入/輸出參數,程序就會使用參數的預設值。 指定輸入或輸入/輸出參數預設值的其他方法是,將繫結至參數之長度/指標緩衝區的值設定成 SQL_DEFAULT_PARAM,或使用 DEFAULT 關鍵字。

如果省略了輸入/輸出參數,或者如果有提供參數的常值,驅動程式就會捨棄輸出值。 同樣地,如果省略了程序傳回值的參數標記,驅動程式就會捨棄傳回值。 最後,如果應用程式指定的程序傳回值參數不會傳回值,驅動程式會將繫結至參數之長度/指標緩衝區的值設定為 SQL_NULL_DATA。

CALL 陳述式中的分隔符號

根據預設,SQL Server Native Client ODBC 驅動程式也支援 ODBC { CALL } 逸出序列特定的相容性選項。 驅動程式會接受 CALL 陳述式以及只有單一一組分隔完整預存程序名稱的雙引號:

{ CALL "master.dbo.sp_who" }  

根據預設,SQL Server Native Client ODBC 驅動程式也會接受遵循 ISO 規則的 CALL 語句,並以雙引號括住每個識別碼:

{ CALL "master"."dbo"."sp_who" }  

不過,使用預設設定執行時,SQL Server Native Client ODBC 驅動程式不支援使用任一形式的引號識別碼,其中包含 ISO 標準識別碼中未指定為合法字元的識別碼。 例如,驅動程式無法使用具有引號識別碼的 CALL 語句來存取名為 「My.Proc」 的預存程式:

{ CALL "MyDB"."MyOwner"."My.Proc" }  

這個陳述式會由驅動程式解譯為:

{ CALL MyDB.MyOwner.My.Proc }  

伺服器會引發名為 MyDB 的連結伺服器不存在的錯誤。

此問題在使用有括號的識別碼時不存在,因為此陳述式會正確解譯:

{ CALL [MyDB].[MyOwner].[My.Table] }  

另請參閱

執行預存程序