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

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

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

下位クライアントの動作

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 へ)
Datetime Date 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 Date 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
SEARCHABLE 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

下位サーバーの動作

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

参照

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