Застосовується до
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), що має обмеження як аргумент:

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

У випадку, коли цю процедуру буде викликано з відповідної процедури, а обмеження порушено для аргументу, можливо, ви неправильно отримаєте систему, що стверджуватиме, коли ви очікуєте отримати повідомлення про помилку "порушення обмеження".

Нижче наведено приклад процедури SQRCLR, що відповідно до умов, які містять порушення обмеження для збереженої процедури.

[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, перелічених у розділі "застосовується до".

 

Посилання

Відомості про термінологію , яку корпорація Майкрософт використовує для опису оновлень програмного забезпечення.

Потрібна додаткова довідка?

Потрібні додаткові параметри?

Ознайомтеся з перевагами передплати, перегляньте навчальні курси, дізнайтесь, як захистити свій пристрій тощо.