Microsoft แจกจ่ายการแก้ไข Microsoft SQL Server 2008 R2 Service Pack 1 (SP1) เป็นไฟล์เดียวที่สามารถดาวน์โหลดได้ เนื่องจากการแก้ไขเป็นแบบสะสม การเผยแพร่ใหม่แต่ละรายการจะมีโปรแกรมแก้ไขด่วนและการแก้ไขข้อบกพร่องด้านความปลอดภัยทั้งหมดที่รวมอยู่ในการแก้ไข SQL Server 2008 R2 Service Pack 1 (SP1) รุ่นก่อนหน้า
อาการ
ลองทำตามสถานการณ์ต่อไปนี้:
- คุณมีคอลัมน์ชนิดข้อมูล datetimeoffset ในตารางใน Microsoft SQL Server 2008 R2 หรือใน Microsoft SQL Server 2012
- คุณสร้างดัชนีบนคอลัมน์ datetimeoffset
- คุณสามารถแปลงชนิดข้อมูล datetimeoffset เป็นชนิดข้อมูล smalldatetime ได้โดยใช้ฟังก์ชัน CAST หรือ CONVERT โดยไม่มีอาร์กิวเมนต์ style หรือเมื่อค่าของอาร์กิวเมนต์ style เป็น 0
- ผลลัพธ์ของฟังก์ชัน CAST หรือ CONVERT จะถูกใช้ในตัวกรองในคิวรี Transact-SQL
- คุณเรียกใช้คิวรี Transact-SQL
ในสถานการณ์นี้ ผลลัพธ์ที่ส่งคืนโดยคิวรีไม่ถูกต้องเนื่องจากตัวกรองทํางานไม่ถูกต้อง ตัวอย่างเช่น สมมติว่าคอลัมน์ datetimeoffset ที่ชื่อ "Date" มีค่าต่อไปนี้
- 2011-05-21 23:00:00 -01:00
- 2011-05-21 23:00:00 +00:00
- 2011-05-21 23:00:00 +01:00
คุณเรียกใช้คิวรีต่อไปนี้:
SELECT Date FROM TestTable WHERE CAST(Date AS smalldatetime)= '2011-05-21 23:00:00'
ผลลัพธ์ของคิวรีส่งกลับเพียงหนึ่งแถว อย่างไรก็ตาม ผลลัพธ์ที่คาดไว้ควรส่งกลับแถวสําหรับทั้งสามค่า
การแก้ปัญหา
ข้อมูลการอัปเดตสะสม
SQL Server 2012
การแก้ไขปัญหานี้เผยแพร่ครั้งแรกใน การอัปเดตสะสม 3 สําหรับ SQL Server 2012 สําหรับข้อมูลเพิ่มเติมเกี่ยวกับแพคเกจโปรแกรมปรับปรุงสะสมนี้ ให้คลิกหมายเลขบทความต่อไปนี้เพื่อดูบทความในฐานความรู้ของ Microsoft:
2723749 แพคเกจการปรับปรุงสะสม 3 สําหรับ SQL Server 2012 หมายเหตุ เนื่องจากรุ่นนี้เป็นแบบสะสม การแก้ไขใหม่แต่ละรุ่นจะมีโปรแกรมแก้ไขด่วนและการแก้ไขความปลอดภัยทั้งหมดที่รวมอยู่ในการแก้ไข SQL Server 2012 รุ่นก่อนหน้า Microsoft ขอแนะนําให้คุณพิจารณาใช้การแก้ไขล่าสุดที่ประกอบด้วยโปรแกรมแก้ไขด่วนนี้ สําหรับข้อมูลเพิ่มเติม โปรดคลิกที่หมายเลขบทความต่อไปนี้เพื่อดูบทความในฐานความรู้ของ Microsoft:
2692828 รุ่น SQL Server 2012 ที่วางจําหน่ายภายหลัง SQL Server 2012 คุณต้องใช้โปรแกรมแก้ไขด่วนของ SQL Server 2012 กับการติดตั้ง SQL Server 2012
SQL Server 2008 R2 Service Pack 2
การแก้ไขสําหรับปัญหานี้ถูกเผยแพร่ครั้งแรกในการอัปเดตสะสม 1 สําหรับ SQL Server 2008 R2 Service Pack 2 สําหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการขอรับแพคเกจโปรแกรมปรับปรุงสะสมนี้ ให้คลิกหมายเลขบทความต่อไปนี้เพื่อดูบทความใน Microsoft Knowledge Base:
2720425 แพคเกจการปรับปรุงสะสม 1 สําหรับ SQL Server 2008 R2 Service Pack 2 หมายเหตุ เนื่องจากรุ่นนี้เป็นแบบสะสม การแก้ไขใหม่ๆ ที่เผยแพร่ใหม่แต่ละรายการจะมีโปรแกรมแก้ไขด่วนและการแก้ไขความปลอดภัยทั้งหมดที่รวมอยู่ในการแก้ไข SQL Server 2008 R2 ก่อนหน้านี้ เราขอแนะนําให้คุณพิจารณาใช้การแก้ไขล่าสุดที่มีโปรแกรมแก้ไขด่วนนี้ไปใช้ สําหรับข้อมูลเพิ่มเติม โปรดคลิกที่หมายเลขบทความต่อไปนี้เพื่อดูบทความในฐานความรู้ของ Microsoft:
2730301 รุ่น SQL Server 2008 R2 ที่วางจําหน่ายภายหลัง SQL Server 2008 R2 Service Pack 2
SQL Server 2008 R2 SP1
การแก้ไขสําหรับปัญหานี้เผยแพร่ครั้งแรกในการอัปเดตสะสม 7 สําหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการขอรับแพคเกจโปรแกรมปรับปรุงสะสมสําหรับ SQL Server 2008 R2 Service Pack 1 นี้ ให้คลิกหมายเลขบทความต่อไปนี้เพื่อดูบทความในฐานความรู้ของ Microsoft:
2703282 แพคเกจการปรับปรุงสะสม 7 สําหรับ SQL Server 2008 R2 SP1 หมายเหตุ เนื่องจากรุ่นนี้เป็นแบบสะสม การแก้ไขใหม่แต่ละรุ่นจะมีโปรแกรมแก้ไขด่วนและการแก้ไขความปลอดภัยทั้งหมดที่รวมอยู่ในการแก้ไข SQL Server 2008 R2 Service Pack 1 ก่อนหน้านี้ เราขอแนะนําให้คุณพิจารณาใช้การแก้ไขล่าสุดที่มีโปรแกรมแก้ไขด่วนนี้ไปใช้ สําหรับข้อมูลเพิ่มเติม โปรดคลิกที่หมายเลขบทความต่อไปนี้เพื่อดูบทความในฐานความรู้ของ Microsoft:
2567616 รุ่น SQL Server 2008 R2 ที่วางจําหน่ายภายหลัง SQL Server 2008 R2 SP1
ข้อมูลเพิ่มเติม
เมื่อต้องการจําลองปัญหาซ้ํา ให้ทําตามขั้นตอนเหล่านี้:
เรียกใช้คิวรีต่อไปนี้เพื่อสร้างตารางที่มีคอลัมน์ datetimeoffset และแทรกระเบียนบางรายการ
CREATE TABLE #TestTimeZones (dto datetimeoffset(0)); ใส่ลงในค่า #TestTimeZones(DTO) ('2011-05-21 23:00:00 -01:00'), ('2011-05-21 23:00:00 +00:00'), ('2011-05-21 23:00:00 +01:00'); ไป
เรียกใช้คิวรีต่อไปนี้ และคุณจะเห็นว่าค่าทั้งสามแสดงอย่างถูกต้องในผลลัพธ์ที่ส่งกลับ:
DECLARE @t smalldatetime = '2011-05-21 23:00:00' SELECT dto AS withoutIndex FROM #TestTimeZones WHERE CAST(dto AS smalldatetime)=@t;
เรียกใช้คิวรีต่อไปนี้เพื่อสร้างดัชนีบนคอลัมน์ "dto" และทําซ้ําคิวรีเดิม:
CREATE INDEX IX_testTimeZones_Dto ON #TestTimeZones(DTO); GO -- ทําซ้ําคิวรีเดียวกัน DECLARE @t smalldatetime = '2011-05-21 23:00:00' SELECT dto AS withIndex FROM #TestTimeZones WHERE CAST(dto A smalldatetime)=@t; ไป
เรียกใช้คิวรีในขั้นตอนที่ 2 อีกครั้ง ครั้งนี้ คิวรีจะส่งกลับเพียงหนึ่งแถว
เรียกใช้คิวรีต่อไปนี้เพื่อลบดัชนีและตารางที่คุณสร้างขึ้น:
DROP INDEX IX_testTimeZones_Dto ON #TestTimeZones; ไปวาง TALBE #TestTimeZones; ไป
การอ้างอิง
สําหรับข้อมูลเพิ่มเติมเกี่ยวกับฟังก์ชัน CAST และ CONVERT ให้ไปที่เว็บไซต์ MSDN ต่อไปนี้:
ข้อมูลทั่วไปเกี่ยวกับฟังก์ชัน CAST และ CONVERT ใน SQL Server
สถานะ
Microsoft ได้ยืนยันว่านี่เป็นปัญหาที่เกิดขึ้นกับผลิตภัณฑ์ของ Microsoft ที่แสดงไว้ในส่วน "นำไปใช้กับ"