Microsoft izplata Microsoft SQL Server 2008 R2 1. servisa pakotnes (SP1) labojumus kā vienu lejupielādējamo failu. Tā kā labojumi ir kumulatīvi, katrā jaunajā laidienā ir iekļauti visi labojumfaili un visi drošības labojumi, kas bija iekļauti iepriekšējā SQL Server 2008 R2 1. servisa pakotnes (SP1) labošanas laidienā.
Simptomi
Iedomājieties šādu scenāriju:
-
Jums ir kolonna datetimeoffset datu tips tabulā programmā Microsoft sql Server 2008 R2 vai Microsoft sql Server 2012.
-
Jūs izveidojat indeksu kolonnā datetimeoffset .
-
Datetimeoffset datu tips tiek pārvērsts par datu tipu datu tips smalldatetime , izmantojot funkciju cast vai convert , nelietojot argumentu stils , vai ja argumenta stils vērtība ir 0.
-
Funkcijas cast vai convert rezultāts tiek izmantots filtrā Transact-SQL vaicājumā.
-
Palaižot Transact-SQL vaicājumu.
Šajā scenārijā vaicājuma atgrieztais rezultāts ir nepareizs, jo filtrs darbojas nepareizi. Piemēram, pieņemsim, ka kolonnā datetimeoffset , kuras nosaukums ir "date", ir šādas vērtības:
-
2011-05-21 23:00:00 -01:00
-
2011-05-21 23:00:00 +00:00
-
2011-05-21 23:00:00 +01:00
Palaidiet šādu vaicājumu:
SELECT Date FROM TestTable WHERE CAST(Date AS smalldatetime)= '2011-05-21 23:00:00'
Vaicājuma rezultāts atgriež tikai vienu rindu. Taču gaidītajam rezultātam jāatgriež rindas visām trim vērtībām.
Risinājums
Kumulatīvās atjaunināšanas informācija
SQL Server 2012
Šīs problēmas labojums pirmo reizi tika izlaists SQL Server 2012 kumulatīvajā atjauninājumā 3. Lai iegūtu papildinformāciju par šo kumulatīvās atjaunināšanas pakotni, noklikšķiniet uz šī raksta numura, lai skatītu Microsoft zināšanu bāzes rakstu:
2723749 Kumulatīvās atjaunināšanas pakotne 3 SQL Server 2012Piezīme. Tā kā būvējums ir kumulatīvs, katrā jaunajā laidienā ir iekļauti visi labojumfaili un visi drošības labojumi, kas bija iekļauti iepriekšējā SQL Server 2012 labošanas laidienā. Microsoft iesaka, ka apsveriet iespēju lietot jaunāko labojumu laidienu, kurā ir iekļauts šis labojumfails. Lai iegūtu papildinformāciju, noklikšķiniet uz šī raksta numura, lai skatītu Microsoft zināšanu bāzes rakstu:
2692828 SQL Server 2012 būvējumi, kas tika izlaisti pēc tam, kad tika izlaists SQL Server 2012 SQL Server 2012 labojumfails ir jālieto SQL Server 2012.
SQL Server 2008 R2 2. servisa pakotne
Šīs problēmas labojums pirmo reizi tika izlaists SQL Server 2008 R2 2. servisa pakotnei. Lai iegūtu papildinformāciju par to, kā iegūt šo kumulatīvo atjaunināšanas pakotni, noklikšķiniet uz šī raksta numura, lai skatītu Microsoft zināšanu bāzes rakstu:
2720425 Kumulatīvās atjaunināšanas pakotne 1 SQL Server 2008 R2 2. servisa pakotneiPiezīme. Tā kā būvējums ir kumulatīvs, katrā jaunajā laidienā ir iekļauti visi labojumfaili un visi drošības labojumi, kas bija iekļauti iepriekšējā SQL Server 2008 R2 labošanas laidienā. Iesakām apsvērt jaunāko labojumu laidienu, kurā ir iekļauts šis labojumfails. Lai iegūtu papildinformāciju, noklikšķiniet uz šī raksta numura, lai skatītu Microsoft zināšanu bāzes rakstu:
2730301 SQL Server 2008 R2 būvējumi, kas tika izlaisti pēc tam, kad tika izlaista SQL Server 2008 R2 2. servisa pakotne
SQL Server 2008 R2 SP1
Šīs problēmas labojums pirmo reizi tika izlaists kumulatīvajā atjaunināšanā 7. Lai iegūtu papildinformāciju par to, kā iegūt šo kumulatīvo atjaunināšanas pakotni SQL Server 2008 R2 1. servisa pakotnei, noklikšķiniet uz šī raksta numura, lai skatītu Microsoft zināšanu bāzes rakstu:
2703282 Kumulatīvās atjaunināšanas pakotne SQL Server 2008 R2 SP1Piezīme. Tā kā būvējums ir kumulatīvs, katrā jaunajā laidienā ir iekļauti visi labojumfaili un visi drošības labojumi, kas bija iekļauti iepriekšējā SQL Server 2008 R2 1. servisa pakotnē. Iesakām apsvērt jaunāko labojumu laidienu, kurā ir iekļauts šis labojumfails. Lai iegūtu papildinformāciju, noklikšķiniet uz šī raksta numura, lai skatītu Microsoft zināšanu bāzes rakstu:
2567616 SQL Server 2008 R2 būvējumi, kas tika izlaisti pēc tam, kad tika izlaists SQL Server 2008 R2 SP1
Papildinformācija
Lai reproducētu problēmu, veiciet tālāk norādītās darbības.
-
Izpildiet šādu vaicājumu, lai izveidotu tabulu ar kolonnu datetimeoffset un ievietotu dažus ierakstus.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
-
Palaidiet tālāk norādīto vaicājumu, un jūs varat redzēt, ka atgriešanas rezultāts ir pareizi uzskaitītas visas trīs vērtības:DECLARE @t smalldatetime = '2011-05-21 23:00:00' SELECT dto AS withoutIndex FROM #TestTimeZones WHERE CAST(dto AS smalldatetime)=@t;
-
Izpildiet šādu vaicājumu, lai izveidotu indeksu kolonnā "DTO" un atkārtotu to pašu vaicājumu: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
-
Vēlreiz izpildiet vaicājumu 2. darbībā. Šoreiz vaicājums atgriež tikai vienu rindu.
-
Palaidiet tālāk norādīto vaicājumu, lai dzēstu indeksu un izveidoto tabulu:DROP INDEX IX_testTimeZones_Dto ON #TestTimeZones; GO DROP TALBE #TestTimeZones; GO
Atsauces
Lai iegūtu papildinformāciju par funkcijām CAST un CONVERT, dodieties uz šādu MSDN tīmekļa vietni:
Vispārēja informācija par funkcijām CAST un CONVERT SQL Server
Statusa
Microsoft ir apstiprinājusi, ka šī problēma pastāv Microsoft produktos, kas ir norādīti sadaļā "attiecas uz".