ストアド プロシージャの呼び出し
適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance 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 プロトコルでは、サーバー側で実行されるパラメーター処理やステートメントの解析作業の多くを排除することで、パフォーマンスを向上しています。
Note
ODBC で名前付きパラメーターを使用して SQL Server ストアド プロシージャを呼び出す場合 (詳細については、「 名前によるパラメーターのバインド (名前付きパラメーター)を参照)、パラメーター名は '@' 文字で始まる必要があります。 これは、SQL Server 固有の制限です。 SQL Server Native Client ODBC ドライバーでは、Microsoft Data Access Components (MDAC) よりも厳密にこの制限が適用されます。
プロシージャを呼び出す ODBC CALL エスケープ シーケンスは、次の構文を使用します。
{[?=]callprocedure_name[([parameter][,[parameter]]...)]}
ここでprocedure_nameプロシージャの名前を指定し、パラメータープロシージャ パラメーターを指定します。 名前付きパラメーターは、ODBC CALL エスケープ シーケンスを使用するステートメントでのみサポートされます。
プロシージャには、0 個以上のパラメーターを指定できます。 また、構文の先頭に省略可能なパラメーター マーカー ?= を指定することによって値を返すこともできます。 パラメーターが入力パラメーターまたは入出力パラメーターの場合は、リテラルまたはパラメーター マーカーを使用できます。 パラメーターが出力パラメーターの場合、出力は不明なので、パラメーター マーカーを使用する必要があります。 プロシージャ呼び出しステートメントを実行する前に、パラメーター マーカーを SQLBindParameter にバインドする必要があります。
プロシージャ呼び出しでは、入力パラメーターと入出力パラメーターを省略できます。 かっこだけを指定し、パラメーターを指定しないでプロシージャを呼び出した場合、ドライバーは最初のパラメーターの既定値を使用するように、データ ソースに指示します。 次に例を示します。
{call procedure_name( )}
プロシージャにパラメーターを指定しないと、失敗する可能性があります。 かっこを付けないでプロシージャを呼び出すと、ドライバーはパラメーター値を送信しません。 次に例を示します。
{call procedure_name}
プロシージャ呼び出しでは、入力パラメーターや入出力パラメーターとしてリテラルを指定できます。 たとえば、InsertOrder プロシージャには 5 つの入力パラメーターがあるとします。 次の InsertOrder の呼び出しでは、最初のパラメーターを省略し、2 番目のパラメーターとしてリテラルを指定して、3 番目、4 番目、5 番目のパラメーターとしてパラメーター マーカーを使用しています (パラメーターには、値 1 から始まる序数が付けられます)。
{call InsertOrder(, 10, ?, ?, ?)}
パラメーターを省略する場合でも、他のパラメーターとの区切りを示すコンマは省略できないことに注意してください。 入力パラメーターまたは入出力パラメーターを省略すると、プロシージャはそのパラメーターの既定値を使用します。 他の方法で入力パラメーターまたは入出力パラメーターの既定値を指定するには、そのパラメーターにバインドされる長さ/インジケーター バッファーの値を SQL_DEFAULT_PARAM に設定するか、DEFAULT キーワードを使用します。
入出力パラメーターを省略した場合、または入出力パラメーターとしてリテラルを指定した場合、ドライバーは出力値を破棄します。 同様に、プロシージャの戻り値のパラメーター マーカーを省略した場合、ドライバーは戻り値を破棄します。 最後に、値を返さないプロシージャに戻り値パラメーターを指定すると、ドライバーは、そのパラメーターにバインドされる長さ/インジケーター バッファーの値を SQL_NULL_DATA に設定します。
CALL ステートメント内の区切り記号
既定では、SQL Server Native Client ODBC ドライバーでは、ODBC { CALL } エスケープ シーケンスに固有の互換性オプションもサポートされています。 ドライバーは、1 組の二重引用符でストアド プロシージャ名全体を区切る 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] }