ストアド プロシージャには、0 個以上のパラメーターを指定できます。 また、値を返すこともできます。 SQL Server Native Client OLE DB プロバイダーを使用する場合、ストアド プロシージャへのパラメーターは次の方法で渡すことができます。
データ値をハードコーディングします。
パラメーター マーカー (?) を使用してパラメーターを指定し、プログラム変数をパラメーター マーカーにバインドしてから、プログラム変数にデータ値を配置します。
注
OLE DB で名前付きパラメーターを使用して SQL Server ストアド プロシージャを呼び出す場合、パラメーター名は '@' 文字で始まる必要があります。 これは SQL Server 固有の制限です。 SQL Server Native Client OLE DB プロバイダーでは、MDAC よりも厳密にこの制限が適用されます。
パラメーターをサポートするために、 ICommandWithParameters インターフェイスはコマンド オブジェクトで公開されます。 パラメーターを使用するために、コンシューマーはまず 、ICommandWithParameters::SetParameterInfo メソッドを呼び出してプロバイダーにパラメーターを記述します (または、必要に応じて 、GetParameterInfo メソッドを呼び出す呼び出し元ステートメントを準備します)。 その後、コンシューマーはバッファーの構造を指定するアクセサーを作成し、このバッファーにパラメーター値を配置します。 最後に、アクセサーのハンドルと、 Execute へのバッファーへのポインターを渡します。 後で Execute を呼び出した場合、コンシューマーは新しいパラメーター値をバッファーに配置し、アクセサー ハンドルとバッファー ポインターを使用して Execute を呼び出します。
パラメーターを使用して一時ストアド プロシージャを呼び出すコマンドは、コマンドを正常に準備する前に、まず ICommandWithParameters::SetParameterInfo を呼び出してパラメーター情報を定義する必要があります。 これは、一時ストアド プロシージャの内部名がクライアントで使用される外部名と異なり、SQLOLEDB はシステム テーブルにクエリを実行して一時ストアド プロシージャのパラメーター情報を決定できないためです。
パラメーター バインド プロセスの手順を次に示します。
DBPARAMBINDINFO 構造体の配列にパラメーター情報を入力します。つまり、パラメーター名、パラメーターのデータ型のプロバイダー固有の名前、または標準のデータ型名などです。 配列内の各構造体は、1 つのパラメーターを記述します。 この配列は、 SetParameterInfo メソッドに渡されます。
ICommandWithParameters::SetParameterInfo メソッドを呼び出して、プロバイダーへのパラメーターを記述します。 SetParameterInfo は、各パラメーターのネイティブ データ型を指定します。 SetParameterInfo 引数は次のとおりです。
型情報を設定するパラメーターの数。
型情報を設定するパラメーター序数の配列。
DBPARAMBINDINFO 構造体の配列。
IAccessor::CreateAccessor コマンドを使用して、パラメーター アクセサーを作成します。 アクセサーはバッファーの構造を指定し、パラメーター値をバッファーに配置します。 CreateAccessor コマンドは、一連のバインディングからアクセサーを作成します。 これらのバインディングは、DBBINDING 構造体の配列を使用してコンシューマーによって記述されます。 各バインディングは、コンシューマーのバッファーに 1 つのパラメーターを関連付け、次のような情報を含みます。
バインドが適用されるパラメーターの序数。
バインドされる内容 (データ値、その長さ、および状態)。
これらの各部分へのバッファー内のオフセット。
コンシューマーのバッファーに存在するデータ値の長さと型。
アクセサーは、HACCESSOR 型のハンドルによって識別されます。 このハンドルは、 CreateAccessor メソッドによって返されます。 コンシューマーがアクセサーの使用を終了するたびに、コンシューマーは ReleaseAccessor メソッドを呼び出して、保持しているメモリを解放する必要があります。
コンシューマーは、 ICommand::Execute などのメソッドを呼び出すと、アクセサーとバッファー自体へのポインターにハンドルを渡します。 プロバイダーは、このアクセサーを使用して、バッファーに含まれるデータを転送する方法を決定します。
DBPARAMS 構造体を入力します。 入力パラメーター値が取得され、出力パラメーター値が書き込まれるコンシューマー変数は、実行時に DBPARAMS 構造体の ICommand::Execute に渡されます。 DBPARAMS 構造体には、次の 3 つの要素が含まれています。
アクセサー ハンドルで指定されたバインディングに従って、プロバイダーが入力パラメーター データを取得し、プロバイダーが出力パラメーター データを返すバッファーへのポインター。
バッファー内のパラメーター セットの数。
手順 3 で作成したアクセサー ハンドル。
ICommand::Execute を使用してコマンドを実行します。
ストアド プロシージャを呼び出すメソッド
SQL Server でストアド プロシージャを実行する場合、SQL Server Native Client OLE DB プロバイダーは次の機能をサポートします。
ODBC CALL エスケープ シーケンス。
リモート プロシージャ コール (RPC) エスケープ シーケンス。
EXECUTE ステートメント Transact-SQL します。
ODBC CALL エスケープ シーケンス
パラメーター情報がわかっている場合は、 ICommandWithParameters::SetParameterInfo メソッドを呼び出して、プロバイダーにパラメーターを記述します。 それ以外の場合、ODBC CALL 構文を使用してストアド プロシージャを呼び出すとき、プロバイダーはヘルパー関数を呼び出してストアド プロシージャのパラメーター情報を検索します。
パラメーター情報 (パラメーター メタデータ) が不明な場合は、ODBC CALL 構文をお勧めします。
ODBC CALL エスケープ シーケンスを使用してプロシージャを呼び出す一般的な構文は次のとおりです。
{[?=]callprocedure_name[([parameter][,[parameter]]...)]}
例えば次が挙げられます。
{call SalesByCategory('Produce', '1995')}
RPC エスケープ シーケンス
RPC エスケープ シーケンスは、ストアド プロシージャを呼び出す ODBC CALL 構文に似ています。 プロシージャを複数回呼び出す場合、RPC エスケープ シーケンスはストアド プロシージャを呼び出す 3 つのメソッドの中で最も最適なパフォーマンスを提供します。
RPC エスケープ シーケンスを使用してストアド プロシージャを実行する場合、プロバイダーはヘルパー関数を呼び出してパラメーター情報を特定しません (ODBC CALL 構文の場合と同様)。 RPC 構文は ODBC CALL 構文よりも単純であるため、コマンドの解析速度が速くなり、パフォーマンスが向上します。 この場合は、 ICommandWithParameters::SetParameterInfo を実行してパラメーター情報を指定する必要があります。
RPC エスケープ シーケンスでは、戻り値が必要です。 ストアド プロシージャが値を返さない場合、サーバーは既定で 0 を返します。 また、ストアド プロシージャで SQL Server カーソルを開くことはできません。 ストアド プロシージャは暗黙的に準備され、 ICommandPrepare::P repare の呼び出しは失敗します。 RPC 呼び出しを準備できないため、列メタデータのクエリを実行することはできません。IColumnsInfo::GetColumnInfo と IColumnsRowset::GetColumnsRowset はDB_E_NOTPREPAREDを返します。
すべてのパラメーター メタデータがわかっている場合は、ストアド プロシージャを実行するための RPC エスケープ シーケンスをお勧めします。
ストアド プロシージャを呼び出すための RPC エスケープ シーケンスの例を次に示します。
{rpc SalesByCategory}
RPC エスケープ シーケンスを示すサンプル アプリケーションについては、「 ストアド プロシージャの実行 (RPC 構文を使用)」および「リターン コードと出力パラメーターの処理 (OLE DB)」を参照してください。
Transact-SQL EXECUTE ステートメント
ODBC CALL エスケープ シーケンスと RPC エスケープ シーケンスは、 EXECUTE ステートメントではなくストアド プロシージャを呼び出すための推奨メソッドです。 SQL Server Native Client OLE DB プロバイダーは、SQL Server の RPC メカニズムを使用してコマンド処理を最適化します。 この RPC プロトコルは、サーバーで実行されるパラメーター処理とステートメント解析の多くを排除することで、パフォーマンスを向上させます。
Transact-SQL EXECUTE ステートメントの例を次に示します。
EXECUTE SalesByCategory 'Produce', '1995'