ストアド プロシージャの呼び出し

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 Data Access Components (MDAC) の場合よりも厳密にこの制限が適用されます。

プロシージャを呼び出す ODBC CALL エスケープ シーケンスは、次の構文を使用します。

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

ここで、procedure_name にはプロシージャ名を、parameter にはプロシージャ パラメーターを指定します。名前付きパラメーターは、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] }