SQL ステートメントのパラメーターを記述するために、SQL Server Native Client ODBC ドライバーは、準備された ODBC ステートメント ハンドルで SQLDescribeParam が呼び出されたときに、Transact-SQL SELECT ステートメントをビルドして実行します。 結果セットのメタデータによって、準備されたステートメント内のパラメーターの特性が決まります。 SQLDescribeParam は、SQLExecute または SQLExecDirect が返す可能性があるエラー コードを返すことができます。
SQL Server 2012 以降のデータベース エンジンの機能強化により、SQLDescribeParam は予想される結果のより正確な説明を取得できます。 これらのより正確な結果は、以前のバージョンの SQL Server で SQLDescribeParam によって返される値とは異なる場合があります。 詳細については、「 メタデータの検出」を参照してください。
また、SQL Server 2012 の新機能 である ParameterSizePtr は、 ODBC 仕様で定義されている対応するパラメーター マーカーの列または式のサイズの定義に合わせた値を文字で返すようになりました。 以前のバージョンの SQL Server Native Client では、 ParameterSizePtr は、型の SQL_DESC_OCTET_LENGTH の対応する値、または型の SQLBindParameter に指定された無関係な列サイズ値で、その値は無視する必要があります (SQL_INTEGERなど)。
ドライバーは、次の状況で SQLDescribeParam の呼び出しをサポートしていません。
FROM 句を含む Transact-SQL UPDATE ステートメントまたは DELETE ステートメントの SQLExecDirect の後。
HAVING 句内のパラメーターを含む ODBC または Transact-SQL ステートメントの場合、または SUM 関数の結果と比較します。
パラメーターを含むサブクエリに応じて、ODBC または Transact-SQL ステートメントの場合。
比較の両方の式にパラメーター マーカーを含む ODBC SQL ステートメントの場合は、たとえば、量指定された述語です。
いずれかのパラメーターが関数のパラメーターであるクエリの場合。
Transact-SQL コマンドにコメント (/* */) がある場合。
Transact-SQL ステートメントのバッチを処理する場合、ドライバーは、バッチ内の最初のステートメントの後のステートメント内のパラメーター マーカーに対する SQLDescribeParam の呼び出しもサポートしていません。
準備されたストアド プロシージャのパラメーターを記述する場合、SQLDescribeParam はシステム ストアド プロシージャ sp_sproc_columns を使用してパラメーターの特性を取得します。 sp_sproc_columnsは、現在のユーザー データベース内のストアド プロシージャのデータを報告できます。 完全修飾ストアド プロシージャ名を準備すると、SQLDescribeParam をデータベース間で実行できます。 たとえば、システム ストアド プロシージャ sp_who は、次のように任意のデータベースで準備および実行できます。
SQLPrepare(hstmt, "{call sp_who(?)}", SQL_NTS);
準備が成功した後に SQLDescribeParam を実行すると、 master以外のデータベースに接続すると、空の行セットが返されます。 次のように準備された同じ呼び出しにより、現在のユーザー データベースに関係なく SQLDescribeParam が成功します。
SQLPrepare(hstmt, "{call master..sp_who(?)}", SQL_NTS);
大きな値のデータ型の場合、 DataTypePtr で返される値はSQL_VARCHAR、SQL_VARBINARY、またはSQL_NVARCHARです。 大きな値のデータ型パラメーターのサイズが "無制限" であることを示すために、SQL Server Native Client ODBC ドライバーは ParameterSizePtr を 0 に設定します。 標準 varchar パラメーターの実際のサイズ値が返されます。
注
パラメーターが既にSQL_VARCHAR、SQL_VARBINARY、またはSQL_WVARCHARパラメーターの最大サイズでバインドされている場合は、パラメーターのバインド されたサイズが "無制限" ではなく返されます。
"無制限" サイズの入力パラメーターをバインドするには、実行時のデータを使用する必要があります。 "無制限" サイズの出力パラメーターをバインドすることはできません ( SQLGetData が結果セットに対して行うのと同様に、出力パラメーターからデータをストリーミングする方法はありません)。
出力パラメーターの場合、バッファーをバインドする必要があり、値が大きすぎる場合は、バッファーが塗りつぶされ、SQL_SUCCESS_WITH_INFOメッセージが返され、"文字列データ;右の切り捨て" という警告が表示されます。 切り捨てられたデータは破棄されます。
SQLDescribeParam パラメーターと Table-Valued パラメーター
アプリケーションは、SQLDescribeParam を使用して、準備されたステートメントのテーブル値パラメーター情報を取得できます。 詳細については、「 準備されたステートメントのパラメーター メタデータTable-Valued する」を参照してください。
一般的なテーブル値パラメーターの詳細については、「 Table-Valued パラメーター (ODBC)」を参照してください。
拡張日時機能に対する SQLDescribeParam のサポート
日付型または時刻型に対して返される値を次に示します。
| DataTypePtr | ParameterSizePtr | DecimalDigitsPtr | |
|---|---|---|---|
| datetime | SQL_TYPE_TIMESTAMP(SQLのタイムスタンプ型) | 23 | 3 |
| smalldatetime(スモールデイトタイム) | SQL_TYPE_TIMESTAMP(SQLのタイムスタンプ型) | 16 | 0 |
| 日付 | SQL_TYPE_DATE | 10 | 0 |
| 時間 | SQL_SS_TIME2 | 8、10..16 | 0..7 |
| datetime2 | SQL_TYPE_TIMESTAMP(SQLのタイムスタンプ型) | 19、21..27 | 0..7 |
| datetimeoffset (デイトタイムオフセット) | SQL_SS_TIMESTAMPOFFSET (タイムスタンプオフセット) | 26、28..34 | 0..7 |
詳細については、「 Date and Time Improvements (ODBC)」を参照してください。
大きな CLR UDT に対する SQLDescribeParam のサポート
SQLDescribeParam では、大きな CLR ユーザー定義型 (UDT) がサポートされています。 詳細については、「 Large CLR ユーザー定義型 (ODBC)を参照してください。