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 כטבלה

(

מזהה int מפתח ראשי, -- הפונקציה UNIQUE תעשה גם את הטריק

int של נתונים

);

בצע

צור פרוצדורה TestTvpProc @tvp TestTvpType לקריאה בלבד

כ:

התחלה

select * from @tvp;

סיום;

בצע

בתרחיש שבו מתבצעת קריאה לפרוצדורה מאוחסנת של SQLCLR וההפרה של האילוץ עבור הארגומנט עלולה לקבל באופן שגוי קביעה של המערכת, כאשר היית מצפה לקבל הודעת שגיאה מסוג "הפרת אילוץ".

      

להלן דוגמה לפרוצדורת 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));

אכלס את ה- TVP כך שיפעיל שגיאת הפרת מפתח ראשי

myDataTable.Rows.Add(1, 1000);

myDataTable.Rows.Add(1, 2000);

פרמטר SqlParameter = sqlParameter();

פרמטר. ParameterName = "@tvp";

פרמטר. SqlDbType = System.Data.SqlDbType.Structured;

פרמטר. Value = myDataTable;

הפקודה SqlCommand = SqlCommand החדש("TestTvpProc", connection);

הפקודה. CommandType = CommandType.StoredProcedure;

הפקודה. Parameters.Add(parameter);

חיבור. פתח ();

using (SqlDataReader reader = command. 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 משתמשת לתיאור עדכוני תוכנה.