次の方法で共有


以前のバージョンの SQL Server における、強化された日付型と時刻型の動作 (ODBC)

適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

このトピックでは、拡張日時機能を使用するクライアント アプリケーションが SQL Server 2008 (10.0.x) より前のバージョンの SQL Server と通信する場合、および Microsoft Data Access Components、Windows Data Access Components、または SQL Server 2008 (10.0.x) より前のバージョンの SQL Server Native Client を使用するクライアント アプリケーションが、拡張日付と時刻の機能をサポートするサーバーにコマンドを送信する場合の予期される動作について説明します。

下位クライアントの動作

SQL Server 2008 (10.0.x) より前のバージョンの SQL Server Native Client を使用してコンパイルされたクライアント アプリケーションでは、新しい日付/時刻型が nvarchar 列として表示されます。 列の内容は、ODBC の日付と時刻の改善のためのデータ型のサポートの「データ形式: 文字列とリテラル」セクションで説明されているように、リテラル表現 です。 列のサイズは、列に指定された秒の小数部の有効桁数に対するリテラルの最大長です。

カタログ API によって、クライアントに返される下位データ型のコード (nvarchar など) および関連する下位の表現 (適切なリテラル形式など) と一貫性のあるメタデータが返されます。 ただし、返されるデータ型名は実際の SQL Server 2008 (10.0.x) 型名になります。

SQLDescribeCol、SQLDescribeParam、SQGetDescField、SQLColAttribute によって返されるステートメント メタデータは、型名を含むすべての点で下位レベルの型と一致するメタデータを返します。 このような下位レベル型の例として、 nvarcharがあります。

スキーマが日付/時刻型に変更された SQL Server 2008 (10.0.x) (以降) サーバーに対して下位レベルのクライアント アプリケーションを実行する場合、想定される動作は次のとおりです。

SQL Server 2005 の型 SQL Server 2008 (10.0.x) (またはそれ以降) 型 ODBC クライアントの型 結果の変換 (SQL から C へ) パラメーターの変換 (C から SQL へ)
日時 SQL_C_TYPE_DATE [OK] OK (1)
SQL_C_TYPE_TIMESTAMP 時刻フィールドは 0 に設定されます。 OK (2)

時刻フィールドが 0 以外の場合は失敗します。 SQL Server 2005 (9.x) で動作します。
Time(0) SQL_C_TYPE_TIME [OK] OK (1)
SQL_C_TYPE_TIMESTAMP 日付フィールドは現在の日付に設定されます。 OK (2)

日付は無視されます。 秒の小数部が 0 以外の場合は失敗します。 SQL Server 2005 (9.x) で動作します。
Time(7) SQL_C_TIME 失敗 - 時間リテラルが無効です。 OK (1)
SQL_C_TYPE_TIMESTAMP 失敗 - 時間リテラルが無効です。 OK (1)
Datetime2(3) SQL_C_TYPE_TIMESTAMP [OK] OK (1)
Datetime2(7) SQL_C_TYPE_TIMESTAMP [OK] クライアントでの変換により、値は 1/300 秒単位に丸められます。
Smalldatetime SQL_C_TYPE_DATE OK OK
SQL_C_TYPE_TIMESTAMP 時刻フィールドは 0 に設定されます。 OK (2)

時刻フィールドが 0 以外の場合は失敗します。 SQL Server 2005 (9.x) で動作します。
Time(0) SQL_C_TYPE_TIME OK OK
SQL_C_TYPE_TIMESTAMP 日付フィールドは現在の日付に設定されます。 OK (2)

日付は無視されます。 秒の小数部が 0 以外の場合は失敗します。

SQL Server 2005 (9.x) で動作します。
Datetime2(0) SQL_C_TYPE_TIMESTAMP OK OK

記号の説明

Symbol 意味
1 SQL Server 2005 (9.x) で動作していた場合は、より新しいバージョンの SQL Server で引き続き動作する必要があります。
2 SQL Server 2005 (9.x) で動作していたアプリケーションは、より新しいバージョンの SQL Server で失敗する可能性があります。

一般的なスキーマ変更のみが考慮されていることに注意してください。 一般的な変更は次のとおりです。

  • 論理的にアプリケーションで日付値または時刻値のみが必要な場合に、新しい型を使用します。 ただし、個別の日付型および時刻型がないため、アプリケーションでは datetime または smalldatetime の使用が強制されました。

  • 追加の秒の小数部の有効桁数または精度を取得するために、新しい型を使用します。

  • 日付と時刻に推奨されるデータ型なので datetime2 に切り替えます。

SQLColumns、SQLProcedureColumns、および SQLSpecialColumns から返される列のメタデータ

日付型または時刻型に対して返される列の値を次に示します。

列の型 date time smalldatetime DATETIME datetime2 datetimeoffset
DATA_TYPE SQL_WVARCHAR SQL_WVARCHAR SQL_TYPE_TIMESTAMP SQL_TYPE_TIMESTAMP SQL_WVARCHAR SQL_WVARCHAR
TYPE_NAME date time smalldatetime DATETIME datetime2 datetimeoffset
COLUMN_SIZE 10 8,10..16 16 23 19、21..27 26、28..34
BUFFER_LENGTH 20 16, 20..32 16 16 38, 42..54 52, 56..68
DECIMAL_DIGITS NULL NULL 0 3 NULL NULL
SQL_DATA_TYPE SQL_WVARCHAR SQL_WVARCHAR SQL_DATETIME SQL_DATETIME SQL_WVARCHAR SQL_WVARCHAR
SQL_DATETIME_SUB NULL NULL SQL_CODE_TIMESTAMP SQL_CODE_TIMESTAMP NULL NULL
CHAR_OCTET_LENGTH NULL NULL NULL NULL NULL NULL
SS_DATA_TYPE 0 0 111 111 0 0

SQLSpecialColumns は、SQL_DATA_TYPE、SQL_DATETIME_SUB、CHAR_OCTET_LENGTH、または SS_DATA_TYPE を返しません。

SQLGetTypeInfo から返されるデータ型のメタデータ

日付型または時刻型に対して返される列の値を次に示します。

列の型 date time smalldatetime DATETIME datetime2 datetimeoffset
TYPE_NAME date time smalldatetime DATETIME datetime2 datetimeoffset
DATA_TYPE SQL_WVARCHAR SQL_WVARCHAR SQL_TYPE_TIMESTAMP SQL_TYPE_TIMESTAMP SQL_WVARCHAR SQL_WVARCHAR
COLUMN_SIZE 10 16 16 23 27 34
LITERAL_PREFIX ' ' ' ' ' '
LITERAL_SUFFIX ' ' ' ' ' '
CREATE_PARAMS NULL NULL NULL NULL NULL NULL
NULLABLE SQL_NULLABLE SQL_NULLABLE SQL_NULLABLE SQL_NULLABLE SQL_NULLABLE SQL_NULLABLE
CASE_SENSITIVE SQL_FALSE SQL_FALSE SQL_FALSE SQL_FALSE SQL_FALSE SQL_FALSE
検索可能 SQL_PRED_SEARCHABLE SQL_PRED_SEARCHABLE SQL_PRED_SEARCHABLE SQL_PRED_SEARCHABLE SQL_PRED_SEARCHABLE SQL_PRED_SEARCHABLE
UNSIGNED_ATTRIBUTE NULL NULL NULL NULL NULL NULL
FXED_PREC_SCALE SQL_FALSE SQL_FALSE SQL_FALSE SQL_FALSE SQL_FALSE SQL_FALSE
AUTO_UNIQUE_VALUE NULL NULL NULL NULL NULL NULL
LOCAL_TYPE_NAME date time smalldatetime DATETIME datetime2 datetimeoffset
MINIMUM_SCALE NULL NULL 0 3 NULL NULL
MAXIMUM_SCALE NULL NULL 0 3 NULL NULL
SQL_DATA_TYPE SQL_WVARCHAR SQL_WVARCHAR SQL_DATETIME SQL_DATETIME SQL_WVARCHAR SQL_WVARCHAR
SQL_DATETIME_SUB NULL NULL SQL_CODE_TIMESTAMP SQL_CODE_TIMESTAMP NULL NULL
NUM_PREC_RADIX NULL NULL NULL NULL NULL NULL
INTERVAL_PRECISION NULL NULL NULL NULL NULL NULL
USERTYPE 0 0 12 22 0 0

下位サーバーの動作

SQL Server 2008 (10.0.x) 以前のバージョンのサーバー インスタンスに接続すると、新しいサーバーの種類または関連付けられているメタデータ コードと記述子フィールドを使用しようとすると、SQL_ERRORが返されます。 "接続しているサーバーのバージョンに対して、SQL データ型が無効です" というメッセージで SQLSTATE HY004 の診断レコード、または、"データ型の属性に関する制限に違反しました" というメッセージで SQLSTATE 07006 の診断レコードが生成されます。

参照

日付と時刻の強化機能 (ODBC)