Microsoft は、Microsoft SQL Server 2008 R2 Service Pack 1 (SP1) の修正プログラムを1つのダウンロード可能なファイルとして配布します。 修正プログラムは累積的であるため、新しいリリースごとに、以前の SQL Server 2008 R2 Service Pack 1 (SP1) 修正プログラムに含まれていたすべての修正プログラムとセキュリティ修正プログラムが含まれています。
現象
次のような状況で問題が発生します。
-
Microsoft SQL Server 2008 R2 または Microsoft SQL Server 2012 のテーブルに datetimeoffset データ型の列が含まれています。
-
Datetimeoffset列でインデックスを作成します。
-
Datetimeoffsetデータ型をsmalldatetimeデータ型に変換するには、 style引数を指定せずにCASTまたはconvert関数を使用するか、 style引数の値が0であるかを指定します。
-
CASTまたはCONVERT関数の結果は、transact-sql クエリのフィルターで使用されます。
-
Transact-sql クエリを実行します。
このシナリオでは、フィルターが正しく動作しないため、クエリによって返される結果が正しくありません。 たとえば、"Date" という名前の datetimeoffset 列には、次の値が含まれているとします。
-
2011-05-21 23:00:00 -01:00
-
2011-05-21 23:00:00 +00:00
-
2011-05-21 23:00:00 +01:00
次のクエリを実行します。
SELECT Date FROM TestTable WHERE CAST(Date AS smalldatetime)= '2011-05-21 23:00:00'
クエリの結果は、1つの行のみを返します。 ただし、予期される結果では、3つのすべての値に対して行を返す必要があります。
解決方法
累積的な更新プログラムの情報
SQL Server 2012
この問題の修正プログラムは、SQL Server 2012 の累積更新プログラム3で最初にリリースされました。この累積的な更新プログラムパッケージの詳細については、次の記事番号をクリックして、Microsoft サポート技術情報の記事を参照してください。
2723749 SQL Server 2012 の累積更新プログラムパッケージ3注: ビルドは累積的であるため、それぞれの新しい修正プログラムには、以前の SQL Server 2012 fix release に含まれていたすべての修正プログラムとセキュリティ修正プログラムが含まれています。 この修正プログラムを含む最新の修正プログラムを適用することを検討することをお勧めします。 詳細については、次のマイクロソフト サポート技術情報番号をクリックしてください。
2692828 SQL Server 2012 がリリースされた後にリリースされた SQL Server 2012 ビルド Sql server 2012 のインストールには、SQL Server 2012 修正プログラムを適用する必要があります。
SQL Server 2008 R2 Service Pack 2
この問題の修正プログラムは、SQL Server 2008 R2 Service Pack 2 の累積更新プログラム1で最初にリリースされました。この累積的な更新プログラムパッケージの入手方法の詳細については、次の記事番号をクリックして、Microsoft サポート技術情報の記事を参照してください。
2720425 SQL Server 2008 R2 Service Pack 2 の累積的な更新プログラムパッケージ1注: ビルドは累積的であるため、各新しい修正プログラムには、以前の SQL Server 2008 R2 fix release に含まれていたすべての修正プログラムとセキュリティ修正プログラムが含まれています。 この修正プログラムを含む最新の修正プログラムを適用することを検討することをお勧めします。 詳細については、次のマイクロソフト サポート技術情報番号をクリックしてください。
2730301 SQL Server 2008 R2 Service Pack 2 がリリースされた後にリリースされた SQL Server 2008 R2 ビルド
SQL Server 2008 R2 SP1
この問題の修正プログラムは、累積的な更新プログラム7で最初にリリースされました。SQL Server 2008 R2 Service Pack 1 用の累積更新プログラムパッケージの入手方法の詳細については、次の記事番号をクリックして、Microsoft サポート技術情報の記事を参照してください。
2703282 累積的な更新プログラムパッケージ 7 (SQL Server 2008 R2 SP1)注: ビルドは累積的であるため、各新しい修正プログラムには、以前の SQL Server 2008 R2 Service Pack 1 修正プログラムに含まれていたすべての修正プログラムとセキュリティ修正プログラムが含まれています。 この修正プログラムを含む最新の修正プログラムを適用することを検討することをお勧めします。 詳細については、次のマイクロソフト サポート技術情報番号をクリックしてください。
2567616 SQL Server 2008 R2 SP1 がリリースされた後にリリースされた SQL Server 2008 R2 ビルド
詳細情報
この問題を再現するには、次の手順を実行します。
-
Datetimeoffset列を含むテーブルを作成し、いくつかのレコードを挿入するには、次のクエリを実行します。CREATE TABLE #TestTimeZones (dto datetimeoffset(0)); GO INSERT INTO #TestTimeZones(dto) VALUES ('2011-05-21 23:00:00 -01:00'), ('2011-05-21 23:00:00 +00:00'), ('2011-05-21 23:00:00 +01:00'); GO
-
次のクエリを実行して、返された結果で3つのすべての値が正しく表示されていることを確認できます。DECLARE @t smalldatetime = '2011-05-21 23:00:00' SELECT dto AS withoutIndex FROM #TestTimeZones WHERE CAST(dto AS smalldatetime)=@t;
-
"Dto" 列でインデックスを作成して、同じクエリを繰り返すには、次のクエリを実行します。CREATE INDEX IX_testTimeZones_Dto ON #TestTimeZones(dto); GO -- Repeat the same query DECLARE @t smalldatetime = '2011-05-21 23:00:00' SELECT dto AS withIndex FROM #TestTimeZones WHERE CAST(dto A smalldatetime)=@t; GO
-
手順2でクエリをもう一度実行します。 今回は、クエリは1つの行のみを返します。
-
次のクエリを実行して、インデックスと作成したテーブルを削除します。DROP INDEX IX_testTimeZones_Dto ON #TestTimeZones; GO DROP TALBE #TestTimeZones; GO
参照情報
CAST 関数と CONVERT 関数の詳細については、次の MSDN web サイトを参照してください。
状態
マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。