อาการ
สมมติว่า คุณมีกระบวนงานที่เก็บไว้ Transact-SQL เช่นต่อไปนี้ที่รับพารามิเตอร์ค่าตาราง (TVP) ที่มีข้อจํากัดเป็นอาร์กิวเมนต์:
สร้างชนิด TestTvpType เป็นตาราง
(
ID int primary key , -- UNIQUE จะทําเคล็ดลับเช่นกัน
data int
);
ไป
create procedure TestTvpProc @tvp TestTvpType readonly
เป็น
เริ่มต้น
เลือก * จาก @tvp;
สิ้น สุด;
ไป
ในสถานการณ์ที่กระบวนงานนี้ถูกเรียกจากกระบวนงานที่เก็บไว้ของ SQLCLR และข้อจํากัดถูกละเมิดสําหรับอาร์กิวเมนต์ คุณอาจได้รับการตรวจสอบระบบอย่างไม่ถูกต้อง เมื่อคุณคาดว่าจะได้รับข้อความแสดงข้อผิดพลาด "การละเมิดข้อจํากัด"
ต่อไปนี้เป็นตัวอย่างของกระบวนงาน SQLCLR ที่ก่อให้เกิดการละเมิดข้อจํากัดสําหรับกระบวนงานที่เก็บไว้:
[SqlProcedure]
public static void ClrProcCallingTsqlProcWithTvpArgument(out int sum)
{
การใช้ (การเชื่อมต่อ SqlConnection = New SqlConnection("context connection=true"))
{
sum = 0;
DataTable myDataTable = new DataTable("TestTvpType");
myDataTable.Columns.Add("id", typeof(Int32));
myDataTable.Columns.Add("data", typeof(Int32));
เติมข้อมูล TVP เพื่อทริกเกอร์ข้อผิดพลาด PRIMARY KEY VIOLATION
myDataTable.Rows.Add(1, 1000);
myDataTable.Rows.Add(1, 2000);
พารามิเตอร์ SqlParameter = ใหม่ SqlParameter();
พารามิเตอร์ ParameterName = "@tvp";
พารามิเตอร์ SqlDbType = System.Data.SqlDbType.Structured;
พารามิเตอร์ Value = myDataTable;
SqlCommand command = new SqlCommand("TestTvpProc", connection);
คำ สั่ง CommandType = CommandType.StoredProcedure;
คำ สั่ง Parameters.Add(parameter);
เชื่อม ต่อ Open();
การใช้ (คําสั่ง ตัวอ่าน SqlDataReader = ExecuteReader())
{
ขณะที่ (ตัวอ่าน) อ่าน())
{
…;
}
}
}
}
การแก้ปัญหา
ปัญหานี้ได้รับการแก้ไขแล้วในการอัปเดตสะสมสําหรับ SQL Server ต่อไปนี้:
การอัปเดตสะสม 5 สําหรับ SQL Server 2016 RTM
การอัปเดตสะสม 2 สําหรับ SQL Server 2016 SP1
การอัปเดตสะสม 4 สําหรับ SQL Server 2014 Service Pack 2
หมาย เหตุ การอัปเดตนี้ทําให้เกิดการส่งกลับข้อความแสดงข้อผิดพลาด "การละเมิดข้อจํากัด" ที่ถูกต้อง
เกี่ยวกับการอัปเดตสะสมสําหรับ SQL Server
การอัปเดตแบบสะสมใหม่สําหรับ SQL Server แต่ละครั้งจะมีการแก้ไขด่วนและการแก้ไขข้อบกพร่องด้านความปลอดภัยทั้งหมดที่รวมอยู่ในการอัปเดตแบบสะสมก่อนหน้า ดูการอัปเดตแบบสะสมล่าสุดสําหรับ SQL Server:
การอัปเดตสะสมล่าสุดสําหรับ SQL Server 2016
การอัปเดตสะสมล่าสุดสําหรับ SQL Server 2014
สถานะ
Microsoft ได้ยืนยันว่านี่เป็นปัญหาที่เกิดขึ้นกับผลิตภัณฑ์ของ Microsoft ที่แสดงไว้ในส่วน "นำไปใช้กับ"
การอ้างอิง
เรียนรู้เกี่ยวกับ คําศัพท์เฉพาะทาง ที่ Microsoft ใช้เพื่ออธิบายการอัปเดตซอฟต์แวร์