KB4010162 - SỬA LỖI: Một giả định hệ thống xảy ra khi một thủ tục lưu trữ Transact-SQL với đối số TVP được gọi từ một thủ tục SQLCLR

Áp dụng cho
SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Enterprise Core - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use) SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use) SQL Server 2016 Service Pack 1

Triệu chứng

Giả sử bạn có một thủ tục lưu trữ Transact-SQL chẳng hạn như quy trình sau có tham số có giá trị bảng (TVP) có ràng buộc làm đối số:

create type TestTvpType as table

(

id int khóa chính, -- UNIQUE cũng sẽ làm các trick

số liệu int

);

Đi

create procedure TestTvpProc @tvp TestTvpType readonly

Như

Bắt đầu

chọn * từ @tvp;

Cuối;

Đi

Trong một kịch bản mà thủ tục này được gọi là từ một SQLCLR lưu trữ thủ tục và ràng buộc là vi phạm đối số, bạn có thể không chính xác nhận một tái hiển thị hệ thống, khi bạn muốn nhận được một thông báo lỗi "vi phạm ràng buộc".

      

Sau đây là ví dụ về quy trình SQLCLR tạo ra vi phạm ràng buộc đối với thủ tục lưu trữ:

      

[SqlProcedure]

tĩnh công cộng clrProcCallingTsqlProcWithTvpArgument(out int sum)

{

sử dụng (Kết nối SqlConnection = SqlConnection mới("context connection=true"))

{

sum = 0;

DataTable myDataTable = DataTable mới("TestTvpType");

myDataTable.Columns.Add("id", typeof(Int32));

myDataTable.Columns.Add("data", typeof(Int32));

Điền TVP để TVP kích hoạt lỗi VI PHẠM KHÓA CHÍNH

myDataTable.Rows.Add(1, 1000);

myDataTable.Rows.Add(1, 2000);

Tham số SqlParameter = SqlParameter mới();

tham số. ParameterName = "@tvp";

tham số. SqlDbType = System.Data.SqlDbType.Structured;

tham số. Giá trị = myDataTable;

Lệnh SqlCommand = SqlCommand mới("TestTvpProc", kết nối);

Lệnh. CommandType = CommandType.StoredProcedure;

Lệnh. Parameters.Add(parameter);

Kết nối. Mở();

sử dụng (Bộ đọc SqlDataReader = lệnh. ExecuteReader())

{

trong khi (bộ đọc. Read())

{

…;

}

}

}

}

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 SQL Server:

Bản cập nhật Tích lũy 5 cho SQL Server 2016 RTM

Bản cập nhật tích lũy 2 cho SQL Server 2016 SP1

Bản cập nhật Tích lũy 4 cho SQL Server 2014 Gói Dịch vụ 2

Lưu ý Bản cập nhật này khiến trả về thông báo lỗi "vi phạm ràng buộc" chính xác.

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 cho bản SQL Server sẽ chứa tất cả các bản cập nhật nóng và bản sửa lỗi bảo mật được bao gồm 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 dành cho doanh SQL Server:

Bản cập nhật tích lũy mới nhất cho SQL Server 2016

Các bản cập nhật tích lũy mới nhất cho SQL Server 2014

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 sử dụng để mô tả các bản cập nhật phần mềm.