Triệu chứng
Giả sử rằng bạn đang sử dụng Microsoft SQL Server 2016 hoặc 2017. Khi bạn xử lý giao dịch dữ liệu được tối ưu hóa cho bộ nhớ bằng cách sử dụng các biến bảng được tối ưu hóa cho bộ nhớ với câu lệnh where exists , bạn có thể nhận được kết quả sai.
Ví dụ:
Bước 1: Tạo bảng và cơ sở dữ liệu được tối ưu hóa cho bộ nhớ.
Bản demo Tạo CƠ SỞ DỮ LIỆU
BẢN DEMO ALTER DATABASE ADD FILEGROUP demo_mod CHỨA MEMORY_OPTIMIZED_DATA
ALTER DATABASE demo ADD FILE (name='demo_mod1', filename='C:\DATA\demo_mod1') TO FILEGROUP demo_mod
Sử dụng Demo
Đi
TẠO KIỂU DBO. IN_MEMORY_TABLE_TYPE DƯỚI DẠNG BẢNG
( source_col INT NULL,
target_col INT not NULL
CHỈ MỤC ix_InMemoryTable PHI LIÊN CỤM (target_col)
) VỚI (MEMORY_OPTIMIZED = BẬT)
GO
Bước 2: Chèn dữ liệu và cập nhật dữ liệu.
KHAI BÁO @t dbo. IN_MEMORY_TABLE_TYPE
CHÈN @t ( source_col, target_col ) GIÁ TRỊ (10, 0),(0, 0)
*chọn * từ @t*
CẬP NHẬT R1 ĐẶT target_col = -1 TỪ @t R1
WHERE EXISTS ( SELECT * FROM @t R2 WHERE r2.source_col > 0 )
*CHỌN * TỪ @t*
GO
Bước 3: Kiểm tra kết quả.
Kết quả Thực tế: Không phải tất cả các hàng của biến số bảng @t được cập nhật.
source_col | target_col
10 | -1
0 | 0
Kết quả mong đợi: Tất cả các hàng sẽ được cập nhật thành target_col = -1.
source_col | target_col
10 | -1
0 | -1.
Giải pháp
Sự cố này đã được khắc phục trong các bản cập nhật tích lũy sau đây dành cho SQL Server:
Cập nhật tích lũy 1 cho SQL Server 2017
Bản cập nhật tích lũy 5 cho SQL Server 2016 SP1
Giới thiệu về các bản cập nhật tích lũy cho SQL Server:
Mỗi bản cập nhật tích lũy mới dành cho SQL Server chứa tất cả các bản sửa lỗi nóng và bản sửa lỗi bảo mật được tích hợp trong bản cập nhật tích lũy trước đó. Xem các bản cập nhật tích lũy mới nhất cho SQL Server:
Bản cập nhật tích lũy mới nhất cho SQL Server 2017
Các bản cập nhật tích lũy mới nhất cho SQL Server 2016
Trạng thái
Microsoft đã xác nhận rằng đây là sự cố trong các sản phẩm của Microsoft được liệt kê trong mục "áp dụng cho".
Tham khảo
Tìm hiểu về thuật ngữ mà Microsoft dùng để mô tả các bản cập nhật phần mềm.