Společnost Microsoft distribuuje Microsoft SQL Server 2008 R2 Service Pack 1 (SP1) jako jeden soubor ke stažení. Protože jsou opravy kumulativní, každá nová verze obsahuje všechny opravy hotfix a všechny opravy zabezpečení, které byly zahrnuté v předchozí verzi systému SQL Server 2008 R2 Service Pack 1 (SP1).
Příznaky
Zvažte následující scénář:
-
V tabulce Microsoft SQL serveru 2008 R2 nebo Microsoft SQL Server 2012 máte sloupec datového typu DateTimeOffset .
-
Index vytvoříte ve sloupci DateTimeOffset .
-
Datový typ DateTimeOffset převedete na datový typ smalldatetime pomocí funkce cast nebo Convert bez argumentu style , nebo pokud je argumentem style hodnota 0.
-
Výsledek funkce cast nebo Convert se používá 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 nefunguje 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í jenom jeden řádek. Očekávaný výsledek by měl vracet řádky pro všechny tři hodnoty.
Řešení
Informace o kumulativní aktualizaci
SQL Server 2012
Oprava pro tento problém byla poprvé vydána v kumulativní aktualizaci 3 pro SQL Server 2012. Další informace o tomto kumulativním balíčku aktualizací najdete v následujícím článku znalostní báze Microsoft Knowledge Base:
2723749 Kumulativní balíček aktualizací 3 pro SQL Server 2012Poznámka Vzhledem k tomu, že buildy jsou kumulativní, každá nová oprava obsahuje všechny opravy hotfix a všechny opravy zabezpečení, které byly součástí předchozího SQL serveru 2012 Oprava. Společnost Microsoft doporučuje zvážit použití nejnovější opravy, která obsahuje tuto opravu hotfix. Další informace naleznete v následujícím článku znalostní báze Microsoft Knowledge Base:
2692828 Buildy SQL Server 2012, které byly vydány po vydání SQL Server 2012 Na instalaci SQL serveru 2012 musíte použít opravu hotfix systému SQL Server 2012.
SQL Server 2008 R2 Service Pack 2
Oprava pro tento problém byla poprvé vydána v kumulativní aktualizaci 1 pro SQL Server 2008 R2 Service Pack 2. Další informace o tom, jak získat tento kumulativní balíček aktualizací, najdete v následujícím článku znalostní báze Microsoft Knowledge Base:
2720425 Kumulativní aktualizace 1 pro SQL Server 2008 R2 Service Pack 2Poznámka Vzhledem k tomu, že buildy jsou kumulativní, každá nová oprava obsahuje všechny opravy hotfix a všechny opravy zabezpečení, které byly součástí předchozího SQL serveru 2008 R2 fix release. Doporučujeme zvážit použití nejnovější opravy, která obsahuje tuto opravu hotfix. Další informace naleznete v následujícím článku znalostní báze Microsoft Knowledge Base:
2730301 Sestavení SQL Server 2008 R2, která byla vydána po SQL serveru 2008 R2 Service Pack 2, byla vydána
SQL Server 2008 R2 SP1
Oprava pro tento problém byla poprvé vydána v kumulativní aktualizaci 7. Další informace o tom, jak získat tento kumulativní balíček aktualizací pro SQL Server 2008 R2 Service Pack 1, najdete v následujícím článku znalostní báze Microsoft Knowledge Base:
2703282 Kumulativní balíček aktualizací 7 pro SQL Server 2008 R2 SP1Poznámka Vzhledem k tomu, že buildy jsou kumulativní, každá nová oprava obsahuje všechny opravy hotfix a všechny opravy zabezpečení, které byly součástí předchozí verze systému SQL Server 2008 R2 Service Pack 1 – oprava. Doporučujeme zvážit použití nejnovější opravy, která obsahuje tuto opravu hotfix. Další informace naleznete v následujícím článku znalostní báze Microsoft Knowledge Base:
2567616 Buildy SQL Server 2008 R2 vydaná po vydání SQL serveru 2008 R2 SP1
Další informace
Problém vyřešíte takto:
-
Spuštěním následujícího dotazu vytvoříte tabulku se sloupcem DateTimeOffset a vložíte některé záznamy: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
-
Spusťte následující dotaz a uvidíte, že všechny tři hodnoty jsou ve výsledku uvedeny správně:DECLARE @t smalldatetime = '2011-05-21 23:00:00' SELECT dto AS withoutIndex FROM #TestTimeZones WHERE CAST(dto AS smalldatetime)=@t;
-
Spuštěním následujícího dotazu vytvoříte index ve sloupci "DTO" a zopakujete dotaz: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
-
Spusťte dotaz znovu v kroku 2. Dotaz pak vrátí jenom jeden řádek.
-
Odstraňte index a tabulku, kterou jste vytvořili, spuštěním následujícího dotazu:DROP INDEX IX_testTimeZones_Dto ON #TestTimeZones; GO DROP TALBE #TestTimeZones; GO
Odkazy
Další informace o funkcích CAST a CONVERT najdete na následujícím webu MSDN:
Stav
Společnost Microsoft potvrzuje, že se jedná o problém v produktech této společnosti, které jsou uvedeny v části Informace v tomto článku jsou určeny pro produkt.