Преминаване към основното съдържание
Поддръжка
Влизане с Microsoft
Влезте или създайте акаунт.
Здравейте,
Изберете друг акаунт.
Имате няколко акаунта
Изберете акаунта, с който искате да влезете.

Симптоми

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

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

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

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

Общностите ви помагат да задавате и отговаряте на въпроси, да давате обратна връзка и да получавате информация от експерти с богати знания.

Беше ли полезна тази информация?

Доколко сте доволни от качеството на езика?
Какво е повлияло на вашия потребителски опит?
Като натиснете „Подаване“, вашата обратна връзка ще се използва за подобряване на продуктите и услугите на Microsoft. Вашият ИТ администратор ще може да събира тези данни. Декларация за поверителност.

Благодарим ви за обратната връзка!

×