"„Microsoft“" platina "„Microsoft“ „SQL Server“ R2 Service Pack 1" (SP1) pataisas kaip vieną atsisiunčiamą failą. Kadangi pataisos yra kaupiamosios, kiekviename naujame leidime yra visos karštosios pataisos ir visos saugos pataisos, kurios buvo įtrauktos į ankstesnį "„SQL Server“ R2" 1 pakeitimų paketo (SP1) pataisą.
Požymiai
Apsvarstykite šį scenarijų:
- "Microsoft „SQL Server“ R2" arba "Microsoft „SQL Server“ 2012" lentelėje yra duomenų tipo stulpelis datetimeoffset duomenų tipas.
- Stulpelyje datetimeoffset sukuriamas indeksas.
- Datetimeoffset duomenų tipas į smalldatetime duomenų tipą konvertuojamas naudojant funkciją CAST arba CONVERT be stiliaus argumento arba kai stiliaus argumento reikšmė yra 0.
- Funkcijos CAST arba CONVERT rezultatas naudojamas "Transact-SQL" užklausos filtre.
- Vykdote "Transact-SQL" užklausą.
Tokiu atveju užklausos grąžintas rezultatas yra neteisingas, nes filtras veikia netinkamai. Pavyzdžiui, tarkime, kad datetimeoffset stulpelyje, pavadintame "Date", yra šios reikšmės:
- 2011-05-21 23:00:00 -01:00
- 2011-05-21 23:00:00 +00:00
- 2011-05-21 23:00:00 +01:00
Vykdoma ši užklausa:
SELECT Date FROM TestTable WHERE CAST(Date AS smalldatetime)= '2011-05-21 23:00:00'
Užklausos rezultatas pateikia tik vieną eilutę. Tačiau laukiamas rezultatas turėtų grąžinti visų trijų reikšmių eilutes.
Sprendimas
Kaupiamojo naujinimo informacija
„SQL Server 2012“
Šios problemos pataisa pirmą kartą buvo išleista "„SQL Server“ 2012" 3 kaupiamajame naujinime. Jei norite gauti daugiau informacijos apie šį kaupiamųjų naujinimų paketą, spustelėkite toliau nurodytą straipsnio numerį ir peržiūrėkite "Microsoft" žinių bazės straipsnį:
2723749 3 kaupiamasis naujinimų paketas, skirtas „SQL Server“ 2012Pastaba Komponavimo versijos yra kaupiamosios, todėl kiekviename naujame pataisos leidime yra visos karštosios pataisos ir visos saugos pataisos, kurios buvo įtrauktos į ankstesnį „SQL Server“ 2012 m. pataisų leidimą. "„Microsoft“" rekomenduoja taikyti naujausią pataisos leidimą, kuriame yra ši karštoji pataisa. Norėdami gauti papildomos informacijos, spustelėkite toliau nurodytą straipsnio numerį ir peržiūrėkite "Microsoft" žinių bazės straipsnį:
2692828 „SQL Server“ 2012" komponavimo versijos, išleistos po 2012 „SQL Server“ išleidimo Turite taikyti „SQL Server“ 2012" karštąsias pataisas „SQL Server“ 2012" diegimui.
„SQL Server“ 2008 R2 2 pakeitimų paketas
Šios problemos pataisa pirmą kartą buvo išleista "„SQL Server“ 2008 R2" 2 pakeitimų paketo 1 kaupiamajame naujinime. Jei norite gauti daugiau informacijos, kaip gauti šį kaupiamąjį naujinimo paketą, spustelėkite toliau nurodytą straipsnio numerį ir peržiūrėkite "Microsoft" žinių bazės straipsnį:
2720425 1 kaupiamojo naujinimo paketas, skirtas "„SQL Server“ 2008 R2" 2 pakeitimų paketuiPastaba Komponavimo versijos yra kaupiamosios, todėl kiekvienoje naujoje pataisoje yra visos karštosios pataisos ir visos saugos pataisos, kurios buvo įtrauktos į ankstesnį "„SQL Server“ 2008 R2" pataisos leidimą. Rekomenduojame taikyti naujausią pataisos leidimą, kuriame yra ši karštoji pataisa. Norėdami gauti papildomos informacijos, spustelėkite toliau nurodytą straipsnio numerį ir peržiūrėkite "Microsoft" žinių bazės straipsnį:
2730301 „SQL Server“ 2008 R2" komponavimo versijos, išleistos išleidus „SQL Server“ 2008 R2 2 pakeitimų paketą
„SQL Server“ 2008 R2 SP1
Šios problemos pataisa pirmą kartą buvo išleista 7 kaupiamajame naujinime. Norėdami gauti daugiau informacijos apie tai, kaip gauti šį kaupiamųjų naujinimų paketą, skirtą „SQL Server“ R2 1 pakeitimų paketui, spustelėkite toliau nurodytą straipsnio numerį ir peržiūrėkite "Microsoft" žinių bazės straipsnį:
2703282 7 kaupiamasis naujinimo paketas, skirtas „SQL Server“ 2008 R2 SP1Note" Kadangi komponavimo versijos yra kaupiamosios, kiekviename naujame pataisos leidime yra visos karštosios pataisos ir visos saugos pataisos, kurios buvo įtrauktos į ankstesnį "„SQL Server“ 2008 R2" 1 pakeitimų paketo pataisos leidimą. Rekomenduojame taikyti naujausią pataisos leidimą, kuriame yra ši karštoji pataisa. Norėdami gauti papildomos informacijos, spustelėkite toliau nurodytą straipsnio numerį ir peržiūrėkite "Microsoft" žinių bazės straipsnį:
2567616 „SQL Server“ 2008 R2 komponavimo versijos, išleistos po 2008 „SQL Server“ R2 SP1 išleidimo
Daugiau informacijos
Norėdami atkurti problemą, atlikite toliau nurodytus veiksmus.
Norėdami sukurti lentelę su stulpeliu datetimeoffset ir įterpti įrašus, vykdykite šią užklausą:
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'); PIRMYN
Vykdykite šią užklausą ir pamatysite, kad visos trys reikšmės pateiktame rezultate išvardytos teisingai:
DECLARE @t smalldatetime = '2011-05-21 23:00:00' SELECT dto AS withoutIndex FROM #TestTimeZones WHERE CAST(dto AS smalldatetime)=@t;
Vykdykite šią užklausą, kad sukurtumėte stulpelio "dto" indeksą ir pakartotų tą pačią užklausą:
KURTI INDEKSO IX_testTimeZones_Dto #TestTimeZones(DTO); GO -- Pakartoti tą pačią užklausą DECLARE @t smalldatetime = '2011-05-21 23:00:00' SELECT dto AS withIndex FROM #TestTimeZones WHERE CAST(dto A smalldatetime)=@t; PIRMYN
Dar kartą paleiskite užklausą atlikdami 2 veiksmą. Šį kartą užklausa pateikia tik vieną eilutę.
Norėdami panaikinti indeksą ir sukurtą lentelę, vykdykite šią užklausą:
DROP INDEX IX_testTimeZones_Dto ON #TestTimeZones; GO DROP TALBE #TestTimeZones; PIRMYN
Nuorodos
Daugiau informacijos apie funkcijas CAST ir CONVERT rasite šioje MSDN svetainėje:
Bendra informacija apie CAST ir CONVERT funkcijas „SQL Server“
Būsena
„„Microsoft““ patvirtino, kad tai yra „„Microsoft““ produktų, išvardytų dalyje „Taikoma“, problema.