Microsoft phân phối Microsoft SQL Server 2008 R2 gói dịch vụ 1 (SP1) bản sửa lỗi dưới dạng một tệp được tải xuống. Vì bản sửa lỗi được tích lũy, mỗi bản phát hành mới chứa tất cả các hotfix và tất cả các bản sửa lỗi bảo mật đã được đưa vào bản phát hành sửa lỗi SQL Server 2008 trước đó 1 (SP1).
Triệu chứng
Hãy xem xét tình huống sau:
-
Bạn có cột kiểu dữ liệu datetimeoffset trong bảng trong Microsoft sql server 2008 R2 hoặc trong Microsoft sql server 2012.
-
Bạn tạo chỉ mục trên cột datetimeoffset .
-
Bạn chuyển đổi kiểu dữ liệu datetimeoffset thành kiểu dữ liệu không gian tên bằng cách dùng hàm cast hoặc Convert mà không có đối số kiểu hoặc khi giá trị của đối số kiểu là 0.
-
Kết quả của hàm cast hoặc Convert sẽ được sử dụng trong bộ lọc trong truy vấn Transact-SQL.
-
Bạn chạy truy vấn Transact-SQL.
Trong trường hợp này, kết quả được trả về bởi truy vấn không chính xác vì bộ lọc không hoạt động đúng. Ví dụ, giả định rằng cột datetimeoffset được đặt tên là "date" có chứa các giá trị sau đây:
-
2011-05-21 23:00:00 -01:00
-
2011-05-21 23:00:00 +00:00
-
2011-05-21 23:00:00 +01:00
Bạn chạy truy vấn sau đây:
SELECT Date FROM TestTable WHERE CAST(Date AS smalldatetime)= '2011-05-21 23:00:00'
Kết quả của truy vấn chỉ trả về một hàng. Tuy nhiên, kết quả dự kiến sẽ trả về hàng cho cả ba giá trị.
Giải pháp
Thông tin Cập Nhật tích lũy
SQL Server 2012
Bản sửa lỗi cho sự cố này lần đầu tiên được phát hành trong Cumulative Update 3 cho SQL Server 2012. Để biết thêm thông tin về gói Cập Nhật lũy tích này, hãy bấm số bài viết sau để xem bài viết trong cơ sở kiến thức Microsoft:
2723749 Gói Cập Nhật tích lũy 3 cho SQL Server 2012Lưu ý Vì bản dựng được tích lũy, mỗi bản phát hành khắc phục sự cố mới chứa tất cả các hotfix và tất cả các bản sửa lỗi bảo mật đã được đưa vào bản phát hành khắc phục SQL Server 2012 trước đó. Microsoft khuyên bạn nên cân nhắc việc áp dụng bản phát hành khắc phục gần đây nhất có chứa các hotfix này. Để biết thêm thông tin, hãy bấm vào số bài viết sau đây để xem bài viết trong Cơ sở Kiến thức Microsoft:
2692828 Bản dựng SQL Server 2012 đã được phát hành sau khi SQL Server 2012 đã được phát hành Bạn phải áp dụng một hotfix SQL Server 2012 vào một bản cài đặt của SQL Server 2012.
Gói dịch vụ SQL Server 2008 R2 2
Bản sửa lỗi cho sự cố này lần đầu tiên được phát hành trong Cumulative Update 1 cho SQL Server 2008 R2 Service Pack 2. Để biết thêm thông tin về cách tải gói Cập Nhật tích lũy này, hãy bấm số bài viết sau để xem bài viết trong cơ sở kiến thức Microsoft:
2720425 Gói Cập Nhật tích lũy 1 cho SQL Server 2008 R2 gói dịch vụ 2Lưu ý Vì bản dựng được tích lũy, mỗi bản phát hành khắc phục sự cố mới chứa tất cả các hotfix và tất cả các bản sửa lỗi bảo mật đã được đưa vào bản phát hành khắc phục SQL Server 2008 trước đó. Chúng tôi khuyên bạn nên cân nhắc việc áp dụng bản phát hành bản sửa lỗi gần đây nhất có chứa hotfix này. Để biết thêm thông tin, hãy bấm vào số bài viết sau đây để xem bài viết trong Cơ sở Kiến thức Microsoft:
2730301 Bản dựng SQL Server 2008 R2 đã được phát hành sau khi SQL Server 2008 R2 Service Pack 2 đã được phát hành
SQL Server 2008 R2 SP1
Bản sửa lỗi cho sự cố này lần đầu tiên được phát hành trong bản Cập Nhật tích lũy 7. Để biết thêm thông tin về cách tải gói Cập Nhật tích lũy cho SQL Server 2008 R2 gói dịch vụ 1, hãy bấm số bài viết sau đây để xem bài viết trong cơ sở kiến thức Microsoft:
2703282 Gói Cập Nhật tích lũy 7 cho SQL Server 2008 R2 SP1Lưu ý Vì bản dựng được tích lũy, mỗi bản phát hành khắc phục sự cố mới chứa tất cả các hotfix và tất cả các bản sửa lỗi bảo mật được đưa vào bản phát hành SQL Server 2008 R2 gói dịch vụ trước đó 1. Chúng tôi khuyên bạn nên cân nhắc việc áp dụng bản phát hành bản sửa lỗi gần đây nhất có chứa hotfix này. Để biết thêm thông tin, hãy bấm vào số bài viết sau đây để xem bài viết trong Cơ sở Kiến thức Microsoft:
2567616 Bản dựng SQL Server 2008 R2 đã được phát hành sau khi SQL Server 2008 R2 SP1 đã được phát hành
Thông tin Bổ sung
Để tái tạo vấn đề này, hãy làm theo các bước sau đây:
-
Chạy truy vấn sau đây để tạo một bảng có cột datetimeoffset và chèn một số bản ghi: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
-
Chạy truy vấn sau đây và bạn có thể thấy rằng cả ba giá trị đều được liệt kê chính xác trong kết quả trả về:DECLARE @t smalldatetime = '2011-05-21 23:00:00' SELECT dto AS withoutIndex FROM #TestTimeZones WHERE CAST(dto AS smalldatetime)=@t;
-
Chạy truy vấn sau đây để tạo chỉ mục trên cột "đến" và lặp lại cùng một truy vấn: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
-
Chạy truy vấn trong bước 2 một lần nữa. Thời gian này, truy vấn chỉ trả về một hàng.
-
Chạy truy vấn sau đây để xóa bỏ chỉ mục và bảng mà bạn đã tạo:DROP INDEX IX_testTimeZones_Dto ON #TestTimeZones; GO DROP TALBE #TestTimeZones; GO
Tham khảo
Để biết thêm thông tin về các hàm CAST và CONVERT, hãy đi tới trang web MSDN sau đây:
Trạng thái
Microsoft đã xác nhận đây là sự cố trong các sản phẩm của Microsoft được liệt kê trong phần "Áp dụng cho".