ストアド プロシージャの呼び出し
SQL Server Native Client ODBC ドライバでは、ストアド プロシージャの実行に関して、ODBC CALL エスケープ シーケンスと Transact-SQL EXECUTE ステートメントの両方がサポートされます。ただし、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] }