以前のバージョンの SQL Server における、新しい日付または時刻の機能の動作 (OLE DB)
適用対象: SQL Server Azure SQL Database 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 での比較
新しい日付型または時刻型に対しては、すべての比較演算子を使用できます。これは、日付型または時刻型ではなく文字列型と見なされるためです。