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:
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
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;
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
Spusťte dotaz znovu v kroku 2. Tentokrát dotaz vrátí pouze jeden řádek.
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.