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?

Phát triển các kỹ năng của bạn
Khám phá nội dung đào tạo
Sở hữu tính năng mới đầu tiên
Tham gia Microsoft dùng nội bộ

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?

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

×