Bỏ qua để tới nội dung chính
Đăng nhập với Microsoft
Đăng nhập hoặc tạo một tài khoản.
Xin chào,
Chọn một tài khoản khác.
Bạn có nhiều tài khoản
Chọn tài khoản bạn muốn đăng nhập.

Triệu chứng

Giả định rằng bạn có một quy trình được lưu trữ theo đạo luật-SQL, chẳng hạn như các bước sau lấy tham số bảng có giá trị (TVP) có ràng buộc là đối số:

create type TestTvpType as table   

(

  id int primary key, -- UNIQUE will also do the trick

  data int

); 

go 

create procedure TestTvpProc @tvp TestTvpType readonly

as

begin

  select * from @tvp;

end;

go

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

Sau đây là một ví dụ về quy trình SQLCLR tạo ra sự vi phạm ràng buộc cho quy trình được lưu trữ:

[SqlProcedure]

public static void ClrProcCallingTsqlProcWithTvpArgument(out int sum)

{

       using (SqlConnection connection = new SqlConnection("context connection=true"))

       {

              sum = 0;

              DataTable myDataTable = new DataTable("TestTvpType");

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

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

              // Populate the TVP so it will trigger a PRIMARY KEY VIOLATION error

              myDataTable.Rows.Add(1, 1000);

              myDataTable.Rows.Add(1, 2000);

              SqlParameter parameter = new SqlParameter();

              parameter.ParameterName = "@tvp";

              parameter.SqlDbType = System.Data.SqlDbType.Structured;

              parameter.Value = myDataTable;

              SqlCommand command = new SqlCommand("TestTvpProc", connection);

              command.CommandType = CommandType.StoredProcedure;

              command.Parameters.Add(parameter);

              connection.Open();

              using (SqlDataReader reader = command.ExecuteReader())

              {

                     while (reader.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 cho 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 thông báo lỗi "vi phạm ràng buộc chính xác".

Mỗi bản Cập Nhật tích lũy mới cho SQL Server chứa tất cả các bản sửa lỗi và bản sửa lỗi bảo mật đã được đưa vào bản Cập Nhật tích lũy trước đó. Kiểm tra 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 2016

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

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".

 

Tham khảo

Tìm hiểu về thuật ngữ Microsoft sử dụng để mô tả các bản cập nhật phần mềm.

Bạn cần thêm trợ giúp?

Bạn muốn xem các tùy chọn khác?

Khám phá các lợi ích của gói đăng ký, xem qua các khóa đào tạo, tìm hiểu cách bảo mật thiết bị của bạn và hơn thế nữa.

Cộng đồng giúp bạn đặt và trả lời các câu hỏi, cung cấp phản hồi và lắng nghe ý kiến từ các chuyên gia có kiến thức phong phú.

Thông tin này có hữu ích không?

Bạn hài lòng đến đâu với chất lượng dịch thuật?
Điều gì ảnh hưởng đến trải nghiệm của bạn?
Khi nhấn gửi, phản hồi của bạn sẽ được sử dụng để cải thiện các sản phẩm và dịch vụ của Microsoft. Người quản trị CNTT của bạn sẽ có thể thu thập dữ liệu này. Điều khoản về quyền riêng tư.

Cảm ơn phản hồi của bạn!

×