次の方法で共有


以前のバージョンの SQL Server における、新しい日付または時刻の機能の動作 (OLE DB)

適用対象: SQL Server Azure SQL データベース Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

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

下位クライアントの動作

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

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

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

OLE DB クライアントの型 SQL Server 2005 の型 SQL Server 2008 (またはそれ以降) の種類 結果の変換 (サーバーからクライアントへ) パラメーターの変換 (クライアントからサーバーへ)
DBTYPE_DBDATE 日時 OK OK
DBTYPE_DBTIMESTAMP 時刻フィールドは 0 に設定されます。 時刻フィールドが 0 以外の場合、文字列の切り捨てが原因で IRowsetChange が失敗します。
DBTYPE_DBTIME Time(0) OK OK
DBTYPE_DBTIMESTAMP 日付フィールドは現在の日付に設定されます。 秒の小数部が 0 以外の場合、IRowsetChange は文字列の切り捨てにより失敗します。

日付は無視されます。
DBTYPE_DBTIME Time(7) 失敗 - 時間リテラルが無効です。 [OK]
DBTYPE_DBTIMESTAMP 失敗 - 時間リテラルが無効です。 [OK]
DBTYPE_DBTIMESTAMP Datetime2(3) OK OK
DBTYPE_DBTIMESTAMP Datetime2(7) OK OK
DBTYPE_DBDATE Smalldatetime OK OK
DBTYPE_DBTIMESTAMP 時刻フィールドは 0 に設定されます。 時刻フィールドが 0 以外の場合、文字列の切り捨てが原因で IRowsetChange が失敗します。
DBTYPE_DBTIME Time(0) OK OK
DBTYPE_DBTIMESTAMP 日付フィールドは現在の日付に設定されます。 秒の小数部が 0 以外の場合、IRowsetChange は文字列の切り捨てにより失敗します。

日付は無視されます。
DBTYPE_DBTIMESTAMP Datetime2(0) OK OK

OK は、SQL Server 2005 (9.x) で動作していた場合は、引き続き SQL Server 2008 (10.0.x) (またはそれ以降) で動作する必要があることを意味します。

次の一般的なスキーマ変更のみが考慮されています。

  • 論理的にアプリケーションで日付値または時刻値のみが必要な場合に、新しい型を使用します。 ただし、 datetime または smalldatetime を使用する必要がありました。これは、個別の日付と時刻の型が使用できなかったためです。

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

  • datetime2に切り替えます。これは、日付と時刻に適したデータ型であるためです。

ICommandWithParameters::GetParameterInfo またはスキーマ行セットを使用して ICommandWithParameters::SetParameterInfo を使用してパラメーター型情報を設定するサーバー メタデータを使用するアプリケーションは、変換元の型の文字列表現が変換先の型の文字列表現よりも大きいクライアント変換中に失敗します。 たとえば、クライアント バインドで DBTYPE_DBTIMESTAMP を使用し、サーバー列が日付の場合、SQL Server Native Client は値を "yyyy-dd-mm hh:mm:ss.fff" に変換しますが、サーバー メタデータは nvarchar(10)として返されます。 その結果発生するオーバーフローが、DBSTATUS_E_CATCONVERTVALUE の原因となります。 行セットメタデータは結果セットメタデータから設定されるため、IRowsetChange によるデータ変換でも同様の問題が発生します。

パラメーターと行セットのメタデータ

このセクションでは、SQL Server 2008 (10.0.x) より前のバージョンの SQL Server Native Client でコンパイルされたクライアントのパラメーター、結果列、およびスキーマ行セットのメタデータについて説明します。

ICommandWithParameters::GetParameterInfo

DBPARAMINFO 構造体は、 prgParamInfo パラメーターを使用して次の情報を返します。

パラメーターのタイプ wType ulParamSize bPrecision bScale
日付 DBTYPE_WSTR 10 ~0 ~0
time DBTYPE_WSTR 8、10..16 ~0 ~0
smalldatetime DBTYPE_DBTIMESTAMP 16 16 0
DATETIME DBTYPE_DBTIMESTAMP 16 23 3
datetime2 DBTYPE_WSTR 19,21..27 ~0 ~0
datetimeoffset DBTYPE_WSTR 26,28..34 ~0 ~0

上記の値の範囲は連続していない場合があることに注意してください。たとえば、"8,10..16" には 9 は含まれません。 有効桁数が 0 より大きい場合は、小数点が追加されるためです。

IColumnsRowset::GetColumnsRowset

返される列を次に示します。

列の型 DBCOLUMN_TYPE DBCOLUMN_COLUMNSIZE DBCOLUMN_PRECISION DBCOLUMN_SCALE、DBCOLUMN_DATETIMEPRECISION
日付 DBTYPE_WSTR 10 NULL NULL
time DBTYPE_WSTR 8、10..16 NULL NULL
smalldatetime DBTYPE_DBTIMESTAMP 16 16 0
DATETIME DBTYPE_DBTIMESTAMP 16 23 3
datetime2 DBTYPE_WSTR 19,21..27 NULL NULL
datetimeoffset DBTYPE_WSTR 26,28..34 NULL NULL

ColumnsInfo::GetColumnInfo

DBCOLUMNINFO 構造体は、次の情報を返します。

パラメーターの型 wType ulColumnSize bPrecision bScale
日付 DBTYPE_WSTR 10 ~0 ~0
time(1..7) DBTYPE_WSTR 8、10..16 ~0 ~0
smalldatetime DBTYPE_DBTIMESTAMP 16 16 0
DATETIME DBTYPE_DBTIMESTAMP 16 23 3
datetime2 DBTYPE_WSTR 19,21..27 ~0 ~0
datetimeoffset DBTYPE_WSTR 26,28..34 ~0 ~0

スキーマ行セット

このセクションでは、新しいデータ型のパラメーター、結果列、およびスキーマ行セットのメタデータについて説明します。 この情報は、SQL Server 2008 (10.0.x) SQL Server Native Client より前のツールを使用して開発されたクライアント プロバイダーがある場合に便利です。

COLUMNS 行セット

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

列の型 DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH DATETIME_PRECISION
日付 DBTYPE_WSTR 10 20 NULL
time DBTYPE_WSTR 8、10..16 16,20..32 NULL
smalldatetime DBTYPE_DBTIMESTAMP NULL NULL 0
DATETIME DBTYPE_DBTIMESTAMP NULL NULL 3
datetime2 DBTYPE_WSTR 19,21..27 38,42..54 NULL
datetimeoffset DBTYPE_WSTR 26,28..34 52, 56..68 NULL

PROCEDURE_PARAMETERS 行セット

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

列の型 DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH TYPE_NAME

LOCAL_TYPE_NAME
日付 DBTYPE_WSTR 10 20 date
time DBTYPE_WSTR 8、10..16 16,20..32 time
smalldatetime DBTYPE_DBTIMESTAMP NULL NULL smalldatetime
datetime DBTYPE_DBTIMESTAMP NULL NULL datetime
datetime2 DBTYPE_WSTR 19,21..27 38,42..54 datetime2
datetimeoffset DBTYPE_WSTR 26,28..34 52, 56..68 datetimeoffset

PROVIDER_TYPES 行セット

日付/時刻型に対して返される行を次に示します。

型 ->

date time smalldatetime DATETIME datetime2 datetimeoffset
TYPE_NAME date time smalldatetime DATETIME datetime2 datetimeoffset
DATA_TYPE DBTYPE_WSTR DBTYPE_WSTR DBTYPE_DBTIMESTAMP DBTYPE_DBTIMESTAMP DBTYPE_WSTR DBTYPE_WSTR
COLUMN_SIZE 10 16 16 23 27 34
LITERAL_PREFIX ' ' ' ' ' '
LITERAL_SUFFIX ' ' ' ' ' '
CREATE_PARAMS NULL NULL NULL NULL NULL NULL
IS_NULLABLE VARIANT_TRUE VARIANT_TRUE VARIANT_TRUE VARIANT_TRUE VARIANT_TRUE VARIANT_TRUE
CASE_SENSITIVE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE
SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE
UNSIGNED_ATTRIBUTE NULL NULL NULL NULL NULL NULL
FIXED_PREC_SCALE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE
AUTO_UNIQUE_VALUE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE
LOCAL_TYPE_NAME date time smalldatetime DATETIME datetime2 datetimeoffset
MINIMUM_SCALE NULL NULL NULL NULL NULL NULL
MAXIMUM_SCALE NULL NULL NULL NULL NULL NULL
GUID NULL NULL NULL NULL NULL NULL
TYPELIB NULL NULL NULL NULL NULL NULL
VERSION NULL NULL NULL NULL NULL NULL
IS_LONG VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE
BEST_MATCH VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_TRUE VARIANT_FALSE VARIANT_FALSE
IS_FIXEDLENGTH VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE

下位サーバーの動作

SQL Server 2008 (10.0.x) より前のバージョンのサーバーに接続すると、新しいサーバーの種類名 (ICommandWithParameters::SetParameterInfo または ITableDefinition::CreateTable など) を使用しようとすると、DB_E_BADTYPENAMEが発生します。

型名を使用せずに新しい型がパラメーターまたは結果にバインドされている場合に、新しい型を使用してサーバーの型を暗黙的に指定するか、サーバーの型からクライアントの型への有効な変換がないと、DB_E_ERRORSOCCURRED が返されます。また、実行時に使用されるアクセサーのバインドの状態に DBBINDSTATUS_UNSUPPORTED_CONVERSION が設定されます。

接続時に、サーバーのバージョンに対して、クライアントでのバッファーの型からサーバーの型への変換がサポートされている場合は、クライアントのすべてのバッファーの型を使用できます。 このコンテキストでは、 server 型 は、ICommandWithParameters::SetParameterInfo で指定された型を意味します。ICommandWithParameters::SetParameterInfo が呼び出されていない場合は、バッファーの種類によって暗黙的に指定されます。 つまり、クライアントでサポートされるサーバーの型への変換が成功した場合、DBTYPE_DBTIME2 および DBTYPE_DBTIMESTAMPOFFSET は、下位サーバーで使用するか、DataTypeCompatibility=80 の場合に使用することができます。 当然ながら、サーバーの型が正しくないと、実際のサーバーの型への暗黙的な変換を実行できない場合にサーバーからエラーが報告されます。

SSPROP_INIT_DATATYPECOMPATIBILITY の動作

SSPROP_INIT_DATATYPECOMPATIBILITYが SSPROPVAL_DATATYPECOMPATIBILITY_SQL2000 に設定されている場合、「拡張日付/時刻型の変更のコピー (OLE DB および ODBC)」 で説明されているように、下位レベルのクライアントに対して新しい日付/時刻型と関連付けられたメタデータがクライアントに表示されます。

IRowsetFind での比較

新しい日付型または時刻型に対しては、すべての比較演算子を使用できます。これは、日付型または時刻型ではなく文字列型と見なされるためです。

参照

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