Microsoft 將 Microsoft SQL Server 2008 R2 Service Pack 1 (SP1)修正為一個可下載的檔案。 因為修正程式是累加的,所以每個新版本都包含舊版 SQL Server 2008 R2 Service Pack 1 (SP1)修正版本中所包含的所有修復程式及所有安全修正程式。
徵狀
請試想下列案例:
-
您在 Microsoft SQL Server 2008 R2 或 Microsoft SQL Server 2012 中的資料表中有 datetimeoffset 資料類型資料行。
-
您在 datetimeoffset 資料行中建立索引。
-
您可以使用CAST或convert函數(不含style引數),或style引數的值為0,將datetimeoffset資料類型轉換為Smalldatetime資料類型。
-
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'
查詢的結果只會傳回一個資料列。 不過,預期的結果應該針對所有三個值傳回資料列。
解決方案
累積更新資訊
SQL Server 2012
此問題的修正程式是在 SQL Server 2012 的累積更新3中第一次發行。如需此累積更新套件的詳細資訊,請按一下下列文章編號,以查看 Microsoft 知識庫中的文章:
2723749 SQL Server 2012 的累積更新套件3注意: 因為組建是累加的,所以每個新的修正程式版本都包含先前 SQL Server 2012 修正版本中所包含的所有修復程式及所有安全性修正程式。 Microsoft 建議您考慮套用包含此熱修復程式的最新修正版本。 如需詳細資訊,請按一下下面的文章編號,檢視「Microsoft 知識庫」中的文章:
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 修正版本中所包含的所有修復程式及所有安全性修正程式。 我們建議您考慮套用包含此熱修復程式的最新修正版本。 如需詳細資訊,請按一下下面的文章編號,檢視「Microsoft 知識庫」中的文章:
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 SQL Server 2008 R2 SP1 的累積更新套件7注意: 因為組建是累加的,所以每個新的修正程式版本都包含先前 SQL Server 2008 R2 Service Pack 1 修正版本中所包含的所有修復程式及所有安全修正程式。 我們建議您考慮套用包含此熱修復程式的最新修正版本。 如需詳細資訊,請按一下下面的文章編號,檢視「Microsoft 知識庫」中的文章:
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
-
請執行下列查詢,您可以在傳回的結果中正確列出所有三個值: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中的查詢。 這次,查詢只會傳回一個資料列。
-
執行下列查詢以刪除索引及您建立的資料表:DROP INDEX IX_testTimeZones_Dto ON #TestTimeZones; GO DROP TALBE #TestTimeZones; GO
參考
如需有關 CAST 與 CONVERT 函數的詳細資訊,請移至下列 MSDN 網站:
狀態
Microsoft 已確認本篇文章<適用於>一節所列之 Microsoft 產品確實有上述問題。