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.