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 組建

其他相關資訊

若要再現問題,請執行下列步驟:

  1. 若要建立含有 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

  2. 請執行下列查詢,您可以在傳回的結果中正確列出所有三個值:DECLARE @t smalldatetime = '2011-05-21 23:00:00' SELECT dto AS withoutIndex FROM #TestTimeZones WHERE CAST(dto AS smalldatetime)=@t;

  3. 請執行下列查詢,以便在 "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

  4. 再次執行步驟2中的查詢。 這次,查詢只會傳回一個資料列。

  5. 執行下列查詢以刪除索引及您建立的資料表:DROP INDEX IX_testTimeZones_Dto ON #TestTimeZones; GO DROP TALBE #TestTimeZones; GO

參考

如需有關 CAST 與 CONVERT 函數的詳細資訊,請移至下列 MSDN 網站:

SQL Server 中 CAST 與 CONVERT 函數的一般資訊

狀態

Microsoft 已確認本篇文章<適用於>一節所列之 Microsoft 產品確實有上述問題。

Need more help?

Expand your skills
Explore Training
Get new features first
Join Microsoft Insiders

Was this information helpful?

How satisfied are you with the translation quality?

What affected your experience?

Any additional feedback? (Optional)

Thank you for your feedback!

×