KB2715289 – OPRAVA: Nesprávne výsledky pri konverzii stĺpca datetimeoffset na stĺpec smalldateTime v SQL Server 2008 R2 alebo v SQL Server 2012, keď existuje index v stĺpci datetimeoffset

Vzťahuje sa na
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

Spoločnosť Microsoft distribuuje opravy balíka Microsoft SQL Server 2008 R2 Service Pack 1 (SP1) ako jeden súbor na stiahnutie. Keďže opravy sú kumulatívne, každé nové vydanie obsahuje všetky rýchle opravy a opravy zabezpečenia, ktoré boli súčasťou predchádzajúcich opráv balíka Service Pack 1 (SP1) pre SQL Server 2008 R2.

Príznaky

Pozrite si nasledujúci scenár:

  • V tabuľke Microsoft SQL Server 2008 R2 alebo Microsoft SQL Server 2012 máte stĺpec typu údajov DateTimeOffset.
  • V stĺpci datetimeoffset vytvoríte index.
  • Typ údajov datetimeoffset sa konvertuje na typ údajov smalldatetime pomocou funkcie CAST alebo CONVERT bez argumentu style, alebo keď je hodnota argumentu style 0.
  • Výsledok funkcie CAST alebo CONVERT sa použije vo filtri v dotaze Transact-SQL.
  • Spustíte dotaz Transact-SQL.

V tomto scenári je výsledok vrátený dotazom nesprávny, pretože filter nefunguje správne. Predpokladajme napríklad, že stĺpec datetimeoffset s názvom Dátum obsahuje nasledujúce 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 nasledujúci dotaz:

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

Výsledok dotazu vráti iba jeden riadok. Očakávaný výsledok by však mal vrátiť riadky pre všetky tri hodnoty.

Riešenie

Informácie o kumulatívnych aktualizáciách

SQL Server 2012

Oprava tohto problému bola prvýkrát vydaná v kumulatívnej aktualizácii 3 pre SQL Server 2012. Ďalšie informácie o tomto balíku kumulatívnych aktualizácií získate po kliknutí na nasledujúce číslo článku publikovaného v databáze Microsoft Knowledge Base:

2723749 Balík kumulatívnej aktualizácie 3 pre SQL Server 2012Poznámka Keďže zostavy sú kumulatívne, každé nové vydanie opravy obsahuje všetky rýchle opravy a opravy zabezpečenia, ktoré boli zahrnuté v predchádzajúcom vydaní opráv SQL Server 2012. Spoločnosť Microsoft odporúča, aby ste zvážili použitie najnovšej opravy, ktorá obsahuje túto opravu. Ďalšie informácie nájdete v článku databázy Microsoft Knowledge Base, ktorý sa zobrazí po kliknutí na príslušné číslo článku:

2692828 Zostavy SQL Server 2012, ktoré boli vydané po vydaní SQL Server 2012 Na inštaláciu SQL Server 2012 je potrebné použiť rýchlu opravu SQL Server 2012.

SQL Server 2008 R2 Service Pack 2

Oprava tohto problému bola prvýkrát vydaná v kumulatívnej aktualizácii 1 pre balík SQL Server 2008 R2 Service Pack 2. Ďalšie informácie o tom, ako získať tento balík kumulatívnej aktualizácie, získate po kliknutí na nasledujúce číslo článku publikovaného v databáze Microsoft Knowledge Base:

2720425 Balík kumulatívnej aktualizácie 1 pre balík SQL Server 2008 R2 Service Pack 2Note Keďže zostavy sú kumulatívne, každé nové vydanie opravy obsahuje všetky rýchle opravy a opravy zabezpečenia, ktoré boli zahrnuté v predchádzajúcom vydaní opráv SQL Server 2008 R2. Odporúčame, aby ste zvážili použitie najnovšej opravy, ktorá obsahuje túto rýchlu opravu. Ďalšie informácie nájdete v článku databázy Microsoft Knowledge Base, ktorý sa zobrazí po kliknutí na príslušné číslo článku:

2730301 Zostavy SQL Server 2008 R2, ktoré boli vydané po vydaní balíka Service Pack 2 SQL Server 2008 R2

SQL Server 2008 R2 SP1

Oprava tohto problému bola prvýkrát vydaná v kumulatívnej aktualizácii 7. Ďalšie informácie o tom, ako získať tento balík kumulatívnej aktualizácie pre SQL Server 2008 R2 Service Pack 1, získate po kliknutí na nasledujúce číslo článku publikovaného v databáze Microsoft Knowledge Base:

2703282 Kumulatívny balík aktualizácie 7 pre SQL Server 2008 R2 SP1Note Keďže zostavy sú kumulatívne, každé nové vydanie opravy obsahuje všetky rýchle opravy a opravy zabezpečenia, ktoré boli súčasťou predchádzajúceho vydania opráv balíka SQL Server 2008 R2 Service Pack 1. Odporúčame, aby ste zvážili použitie najnovšej opravy, ktorá obsahuje túto rýchlu opravu. Ďalšie informácie nájdete v článku databázy Microsoft Knowledge Base, ktorý sa zobrazí po kliknutí na príslušné číslo článku:

2567616 Zostavy SQL Server 2008 R2, ktoré boli vydané po vydaní balíka SQL Server 2008 R2 SP1

Ďalšie informácie

Ak chcete problém reprodukovať, postupujte podľa týchto krokov:

  1. Spustite nasledujúci dotaz, aby ste vytvorili tabuľku so stĺpcom datetimeoffset a vložili záznamy:

    CREATE TABLE #TestTimeZones (dto datetimeoffset(0)); PREJDITE INSERT DO #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'); PREJSŤ

  2. Spustite nasledujúci dotaz a uvidíte, že všetky tri hodnoty sú vo vrátenom výsledku uvedené správne:

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

  3. Na vytvorenie indexu v stĺpci "dto" a na zopakovanie rovnakého dotazu spustite nasledujúci dotaz:

    CREATE INDEX IX_testTimeZones_Dto ON #TestTimeZones(dto); GO -- zopakovanie rovnakého dotazu DECLARE @t smalldatetime = '2011-05-21 23:00:00' SELECT dto AS withIndex FROM #TestTimeZones WHERE CAST(dto A smalldatetime)=@t; PREJSŤ

  4. Znova spustite dotaz v kroku 2. V tomto prípade dotaz vráti len jeden riadok.

  5. Spustite nasledujúci dotaz, čím odstránite index a tabuľku, ktoré ste vytvorili:

    DROP INDEX IX_testTimeZones_Dto NA #TestTimeZones; CHOĎTE VYPUSTIŤ TALBE #TestTimeZones; PREJSŤ

Odkazy

Ďalšie informácie o funkciách CAST a CONVERT nájdete na nasledujúcej webovej lokalite MSDN:

Všeobecné informácie o funkciách CAST a CONVERT na SQL Server

Stav

Spoločnosť Microsoft potvrdila, že ide o problém v produktoch spoločnosti Microsoft, ktoré sú uvedené v časti Vzťahuje sa na.