呼叫預存程式
適用於: SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW)
SQL Server Native Client ODBC 驅動程式同時支援 ODBC CALL 逸出序列和 Transact-SQLEXECUTE 語句來執行預存程式;ODBC CALL 逸出序列是慣用的方法。 使用 ODBC 語法可讓應用程式擷取預存程式的傳回碼,而且 SQL Server Native Client ODBC 驅動程式也經過優化,以使用原本用來在執行 SQL Server 的電腦之間傳送遠端程式 (RPC) 呼叫的通訊協定。 此 RPC 通訊協定可藉由消除伺服器上完成的大部分參數處理和語句剖析,來提升效能。
注意
搭配 ODBC 使用具名參數呼叫 SQL Server 預存程式時(如需詳細資訊,請參閱 依名稱係結參數(具名參數)),參數名稱必須以 '@' 字元開頭。 這是 SQL Server 特定限制。 SQL Server Native Client ODBC 驅動程式會比Microsoft數據存取元件 (MDAC) 更嚴格地強制執行這項限制。
呼叫程式的 ODBC CALL 逸出序列為:
{[?=]callprocedure_name[([parameter][,[parameter]]...)}
其中 procedure_name 指定程式的名稱,而 參數 會指定程序參數。 只有使用 ODBC CALL 逸出序列的 語句才支援具名參數。
程序可以有零或多個參數。 它也可以傳回值(如語法開頭的選擇性參數標記 ?= 所指示)。 如果參數是輸入或輸入/輸出參數,它可以是常值或參數標記。 如果參數是輸出參數,它必須是參數標記,因為輸出未知。 參數標記必須先與 SQLBindParameter 繫結,才能執行程序呼叫陳述式。
輸入和輸入/輸出參數可以從程序呼叫省略。 如果使用括號呼叫程式,但沒有任何參數,驅動程式會指示數據源使用第一個參數的預設值。 例如:
{call procedure_name( )}
如果程序沒有任何參數,程式可能會失敗。 如果沒有括號呼叫程式,驅動程式就不會傳送任何參數值。 例如:
{call procedure_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] }