KB2715289 – OPRAVA: Nesprávné výsledky při převodu sloupce datetimeoffset na sloupec smalldatetime v SQL Server 2008 R2 nebo v SQL Server 2012, pokud existuje index ve sloupci datetimeoffset

Platí pro
SQL Server 2008 R2 Datacenter SQL Server 2008 R2 Developer SQL Server 2008 R2 Enterprise SQL Server 2008 R2 Standard SQL Server 2008 R2 Web SQL Server 2008 R2 Workgroup SQL Server 2012 Business Intelligence SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Standard SQL Server 2012 Web SQL Server 2012 Enterprise Core

Společnost Microsoft distribuuje opravy systému Microsoft SQL Server 2008 R2 Service Pack 1 (SP1) jako jeden soubor ke stažení. Vzhledem k tomu, že opravy jsou kumulativní, obsahuje každá nová verze všechny opravy hotfix a všechny opravy zabezpečení, které byly součástí předchozího vydání opravy pro SQL Server 2008 R2 Service Pack 1 (SP1).

Příznaky

Vezměte v úvahu následující scénář:

  • Máte sloupec datového typu datetimeoffset v tabulce v systému Microsoft SQL Server 2008 R2 nebo Microsoft SQL Server 2012.
  • Vytvoříte index sloupce datetimeoff.
  • Datový typ datetimeoffset převedete na datový typ smalldatetime pomocí funkce CAST nebo CONVERT bez argumentu stylu nebo v případě, že je hodnota argumentu stylu 0.
  • Výsledek funkce CAST nebo CONVERT se použije ve filtru v dotazu Transact-SQL.
  • Spustíte dotaz Transact-SQL.

V tomto scénáři je výsledek vrácený dotazem nesprávný, protože filtr nepracuje správně. Předpokládejme například, že sloupec datetimeoffset s názvem Date obsahuje následující hodnoty:

  • 2011-05-21 23:00:00 -01:00
  • 2011-05-21 23:00:00 +00:00
  • 2011-05-21 23:00:00 +01:00

Spustíte následující dotaz:

SELECT Date FROM TestTable WHERE CAST(Date AS smalldatetime)= '2011-05-21 23:00:00'

Výsledek dotazu vrátí pouze jeden řádek. Očekávaný výsledek by však měl vrátit řádky pro všechny tři hodnoty.

Řešení

Informace o kumulativní aktualizaci

SQL Server 2012

Oprava tohoto problému byla poprvé vydána v kumulativní aktualizaci 3 pro SQL Server 2012. Další informace o tomto balíčku kumulativních aktualizací naleznete v následujícím článku znalostní báze znalostní báze Microsoft Knowledge Base:

2723749 Balíček kumulativní aktualizace 3 pro SQL Server 2012Poznámka: Buildy jsou kumulativní, a proto každá nová verze opravy obsahuje všechny opravy hotfix a všechny opravy zabezpečení, které byly součástí předchozí verze opravy pro SQL Server 2012. Společnost Microsoft doporučuje zvážit použití nejnovější verze opravy, která obsahuje tuto opravu hotfix. Další informace naleznete v následujícím článku znalostní báze znalostní báze Microsoft Knowledge Base:

2692828 Buildy SQL Server 2012 vydané po vydání SQL Server 2012 Opravu hotfix pro SQL Server 2012 musíte použít u instalace SQL Server 2012.

SQL Server 2008 R2 Service Pack 2

Oprava tohoto problému byla poprvé vydána v kumulativní aktualizaci 1 pro SQL Server 2008 R2 Service Pack 2. Další informace o získání tohoto balíčku kumulativní aktualizace naleznete v následujícím článku znalostní báze znalostní báze Microsoft Knowledge Base:

2720425 Balíček kumulativní aktualizace 1 pro SQL Server 2008 R2 Service Pack 2Poznámka Vzhledem k tomu, že buildy jsou kumulativní, obsahuje každá nová verze opravy všechny opravy hotfix a všechny opravy zabezpečení, které byly součástí předchozího vydání opravy SQL Server 2008 R2. Doporučujeme zvážit použití nejnovější verze opravy, která obsahuje tuto opravu hotfix. Další informace naleznete v následujícím článku znalostní báze znalostní báze Microsoft Knowledge Base:

2730301 Buildy SQL Server 2008 R2, které byly vydány po vydání aktualizace Service Pack 2 SQL Server 2008 R2

SQL Server 2008 R2 SP1

Oprava tohoto problému byla poprvé vydána v kumulativní aktualizaci 7. Další informace o získání tohoto balíčku kumulativní aktualizace pro SQL Server 2008 R2 Service Pack 1 naleznete v následujícím článku znalostní báze znalostní báze Microsoft Knowledge Base:

2703282 Balíček kumulativní aktualizace 7 pro SQL Server 2008 R2 SP1Poznámka: Vzhledem k tomu, že buildy jsou kumulativní, obsahuje každá nová verze opravy všechny opravy hotfix a všechny opravy zabezpečení, které byly součástí předchozího vydání opravy Service Pack 1 pro SQL Server 2008 R2. Doporučujeme zvážit použití nejnovější verze opravy, která obsahuje tuto opravu hotfix. Další informace naleznete v následujícím článku znalostní báze znalostní báze Microsoft Knowledge Base:

2567616 Buildy SQL Server 2008 R2, které byly vydány po vydání aktualizace SP1 SQL Server 2008 R2

Další informace

Chcete-li problém reprodukovat, postupujte takto:

  1. Pokud chcete vytvořit tabulku se sloupcem datetimeoffset a vložit nějaké záznamy, spusťte následující dotaz:

    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'); PŘEJÍT

  2. Spusťte následující dotaz a uvidíte, že jsou všechny tři hodnoty ve vráceném výsledku uvedené správně:

    DECLARE @t smalldatetime = '2011-05-21 23:00:00' SELECT dto AS withoutIndex FROM #TestTimeZones WHERE CAST(dto AS smalldatetime)=@t;

  3. Chcete-li vytvořit index pro sloupec "dto", spusťte následující dotaz a opakujte stejný dotaz:

    VYTVOŘIT INDEXOVÉ IX_testTimeZones_Dto NA #TestTimeZones(dto); GO -- Opakování stejného dotazu DECLARE @t smalldatetime = '2011-05-21 23:00:00' SELECT dto AS withIndex FROM #TestTimeZones WHERE CAST(dto A smalldatetime)=@t; PŘEJÍT

  4. Spusťte dotaz znovu v kroku 2. Tentokrát dotaz vrátí pouze jeden řádek.

  5. Spuštěním následujícího dotazu odstraňte index a tabulku, kterou jste vytvořili:

    DROP INDEX IX_testTimeZones_Dto ON #TestTimeZones; JDĚTE NA TALBE #TestTimeZones; PŘEJÍT

Reference

Další informace o funkcích CAST a CONVERT naleznete na následujícím webu MSDN:

Obecné informace o funkcích CAST a CONVERT na SQL Serveru

Stav

Společnost Microsoft potvrdila, že se jedná o problém produktů Microsoft, které jsou uvedeny v sekci Platí pro.