KB4039776 - KHẮC PHỤC: Hành vi không chính xác khi bạn sử dụng bảng được tối ưu hóa bộ nhớ với câu lệnh "where exists" trong SQL Server 2016 hoặc 2017

Áp dụng cho
SQL Server 2016 Service Pack 1 SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use) SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use) SQL Server 2017 on Windows (all editions)

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.