Отнася се за
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

В сценарий, при който тази процедура се извиква от 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));

              // 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 използва, за да опише софтуерни актуализации.

Нуждаете ли се от още помощ?

Искате ли още опции?

Разгледайте ползите от абонамента, прегледайте курсовете за обучение, научете как да защитите устройството си и още.