KB4010162 - การแก้ไข: มีการเรียกระบบเมื่อกระบวนงานที่เก็บไว้ Transact-SQL ที่มีอาร์กิวเมนต์ TVP ถูกเรียกจากกระบวนงาน SQLCLR

นำไปใช้กับ
SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Enterprise Core - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use) SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use) SQL Server 2016 Service Pack 1

อาการ

สมมติว่า คุณมีกระบวนงานที่เก็บไว้ 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 ใช้เพื่ออธิบายการอัปเดตซอฟต์แวร์