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

);

בצע

יצירת הליך TestTvpProc @tvp TestTvpType לקריאה בלבד

כ

התחלה

בחר * מתוך @tvp;

סוף;

בצע

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

      

להלן דוגמה של פרוצדורה של SQLCLR המייצרת הפרת אילוץ עבור הפרוצדורה המאוחסנת:

      

[נוהל SQL]

חלל סטטי ציבורי ClrProcCallingTsqlProcWithTvpArgument(out int sum)

{

באמצעות (SqlConnection connection = new SqlConnection("context connection=true"))

{

סכום = 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", חיבור);

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

פקודה. Parameters.Add(פרמטר);

חיבור. Open();

באמצעות (SqlDataReader reader = פקודה. ExecuteReader())

{

בעוד (קורא. Read())

{

…;

}

}

}

}

פתרון

בעיה זו נפתרה בעדכונים המצטברים הבאים עבור SQL Server:

עדכון מצטבר 5 עבור SQL Server 2016 RTM

עדכון מצטבר 2 עבור SQL Server 2016 SP1

עדכון מצטבר 4 עבור SQL Server 2014 Service Pack 2

הערה עדכון זה גורם להחזרה של הודעת השגיאה הנכונה 'הפרת אילוץ'.

אודות עדכונים מצטברים עבור SQL Server

כל עדכון מצטבר חדש עבור SQL SQL Server מכיל את כל התיקונים החמים ותיקוני האבטחה שנכללו בעדכון המצטבר הקודם. עיין בעדכונים המצטברים האחרונים עבור SQL Server:

העדכון המצטבר האחרון עבור SQL Server 2016

העדכונים המצטברים האחרונים עבור SQL Server 2014

מצב

Microsoft אישרה שזוהי בעיה במוצרי Microsoft המפורטים בסעיף "חל על".

חומרי עזר

קבל מידע נוסף על המינוח שבו משתמשת Microsoft כדי לתאר עדכוני תוכנה.