Share via


SQLPrepare

SQL Server Native Client ODBC ドライバは、準備された SQL ステートメントから一時ストアド プロシージャを作成します。ストアド プロシージャは 1 つのステートメントを複数回実行する場合は効率的な方法ですが、ストアド プロシージャを作成することは単純なステートメントを実行するよりもコストがかかります。一般的な規則として、アプリケーションで 4 回以上同じ SQL ステートメントを実行する場合、SQLPrepareSQLExecute の使用を検討してください。

注意

SQL Server では、ODBC の準備/実行モデルがサポートされます。SQLPrepareSQLExecute の動作についての以下の説明は、SQL Server 7.0 より前のバージョンの SQL Server だけに適用されます。

SQLPrepare によって作成される一時ストアド プロシージャには、**#odbc#**useridentifier という名前が付けられます。ここで、useridentifier はプロシージャを識別する最大 8 桁の数字と最大 6 文字のユーザー名を連結したものです。

すべてのパラメータ値がバインドされた場合、または SQL ステートメントにパラメータが含まれない場合、SQLPrepare が一時ストアド プロシージャを作成します。SQLPrepare が呼び出されたときにすべてのパラメータがバインドされなかった場合、SQLExecute がプロシージャを作成します。

SQLPrepare は、SQLExecute よりも効率的にストアド プロシージャを作成できます。SQLPrepare を呼び出す前に、SQLBindParameter を使用してパラメータ値をバインドすることをお勧めします。

一時ストアド プロシージャを生成するために使用する CREATE PROCEDURE ステートメントからエラーが返される場合は、SQLPrepare または SQLExecute から、SET NOEXEC オプションまたは SET PARSEONLY オプションを有効にして SQL Server にステートメントが送信されます (どちらのオプションを有効にするかはステートメントの種類により異なります)。SQL Server がステートメントの構文をチェックして、エラーを返します。

SQLExecute は、SQLPrepare から返される ODBC SQLSTATE と SQL Server エラーを返す場合があります。

SQL Server Native Client ODBC ドライバは、準備されたステートメントで SQLBindParameter を呼び出すことで、InputOutputTypeParameterTypeColumnSize、または DecimalDigits の値が変更される場合、新しい一時ストアド プロシージャを作成します。バインドされたパラメータがクライアント メモリの新しいバッファを指す場合、クライアント メモリのサイズが変更される場合、またはパラメータの長さやインジケータ値を指すポインタが変更される場合は、新しい一時ストアド プロシージャが作成されません。

何かの理由 (権限がないなど) により接続でストアド プロシージャを作成できない場合、SQL Server Native Client ODBC ドライバはストアド プロシージャを使用せずに、SQLExecute が呼び出されるたびに SQL ステートメントを実行します。

既定では、SQL Server Native Client ODBC ドライバでは、切断時に一時ストアド プロシージャが削除されます (その接続に対して SQLDisconnect が呼び出されます)。接続が無期限に開かれたままになっている必要がある場合、このことによって問題が生じる可能性があります。この既定の動作を、ドライバ固有の接続オプション SQL_USE_PROCEDURE_FOR_PREPARE を使用して変更できます。

注意

SET NOCOUNT ON が実行されていると、ストアド プロシージャに埋め込まれた複数のステートメントは、本来は複数の結果セットが作成される場合であっても、複数の結果セットを作成しません。ストアド プロシージャ内部で SQL ステートメントによって生成される行数が、ドライバによって無視されます。

関連項目

概念

ODBC API 実装の詳細

その他の技術情報

SQLPrepare 関数