ينطبق على
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

الأعراض

افترض ان لديك اجراء مخزن في 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

بالنسبة إلى السيناريو الذي يتم فيه استدعاء هذا الاجراء من اجراء مخزن سقلكلر وتم انتهاك القيد للوسيطة ، قد تتلقي بشكل غير صحيح تاكيد النظام ، وذلك عندما تتوقع تلقي رسالة الخطا "خرق القيد".

فيما يلي مثال لاجراء سقلكلر ينتج انتهاك قيد للاجراء المخزن:

[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 2016 RTM

تحديث تراكمي 2 ل SQL Server 2016 SP1

تحديث تراكمي 4 ل SQL Server 2014 Service Pack 2

ملاحظه يؤدي هذا التحديث إلى ظهور رسالة الخطا "مخالفه القيد" الصحيحة.

يتضمن كل تحديث تراكمي جديد ل SQL Server كل الإصلاحات العاجلة وتصحيحات الأمان التي تم تضمينها في التحديث التراكمي السابق. اطلع علي آخر التحديثات التراكمية ل SQL Server:

آخر تحديث تراكمي ل SQL Server 2016

آخر التحديثات التراكمية ل SQL Server 2014

الحالة

أقرت Microsoft أن هذه المشكلة تحدث في منتجات Microsoft المسردة في المقطع "تنطبق على".

 

المراجع

تعرف علي المصطلحات التي تستخدمها Microsoft لوصف تحديثات البرامج.

هل تحتاج إلى مزيد من المساعدة؟

الخروج من الخيارات إضافية؟

استكشف مزايا الاشتراك، واستعرض الدورات التدريبية، وتعرف على كيفية تأمين جهازك، والمزيد.