อาการ
สมมติว่าคุณมีกระบวนงานที่เก็บไว้ของ Transact SQL เช่นสิ่งต่อไปนี้ที่ใช้พารามิเตอร์ที่มีค่าเป็นตาราง (TVP) ที่มี ข้อจำกัด เป็นอาร์กิวเมนต์:
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
ในสถานการณ์สมมติที่กระบวนงานนี้เรียกว่าจากกระบวนงานที่เก็บไว้ SQLCLR และ ข้อจำกัด จะถูกละเมิดสำหรับอาร์กิวเมนต์คุณอาจได้รับระบบ assert อย่างไม่ถูกต้องเมื่อคุณคาดว่าจะได้รับข้อความแสดงข้อผิดพลาด "การละเมิดข้อจำกัด"
ต่อไปนี้เป็นตัวอย่างของกระบวนการ SQLCLR ที่ผลิตการละเมิดข้อจำกัดสำหรับกระบวนงานที่เก็บไว้:
[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())
{
…;
}
}
}
}
การแก้ไข
ปัญหานี้ได้รับการแก้ไขแล้วในการอัปเดตที่สะสมต่อไปนี้สำหรับ SQL Server:
การอัปเดตที่สะสม5สำหรับ SQL Server ๒๐๑๖ RTM
การอัปเดตที่สะสม2สำหรับ SQL Server ๒๐๑๖ SP1
การอัปเดตที่สะสม4สำหรับ SQL Server ๒๐๑๔ Service Pack 2
หมายเหตุ การอัปเดตนี้ทำให้เกิดข้อความแสดงข้อผิดพลาดการส่งกลับค่า "การละเมิดข้อจำกัด" ที่ถูกต้อง
การอัปเดตที่สะสมใหม่แต่ละรายการสำหรับ SQL Server ประกอบด้วยโปรแกรมแก้ไขด่วนและการแก้ไขปัญหาด้านความปลอดภัยทั้งหมดที่รวมอยู่ในการอัปเดตที่สะสมก่อนหน้านี้ ตรวจสอบการอัปเดตที่สะสมล่าสุดสำหรับ SQL Server:
สถานะ
Microsoft ยืนยันว่าปัญหานี้เป็นปัญหาที่เกิดขึ้นกับผลิตภัณฑ์ของ Microsoft ซึ่งมีการระบุไว้ในส่วน "นำไปใช้กับ"
อ้างอิง
เรียนรู้เกี่ยวกับคำ ศัพท์เฉพาะ ทางที่ Microsoft ใช้เพื่ออธิบายการอัปเดตซอฟต์แวร์