סימפטומים
נניח שיש לך פרוצדורה מאוחסנת של 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 כדי לתאר עדכוני תוכנה.