Dotyczy
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

Symptomy

Załóżmy, że masz procedurę przechowywaną języka Transact-SQL, taką jak poniższe, które pobierają parametr z wartościami przechowywanymi w tabeli (TVP), który ma ograniczenie jako argument:

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

W scenariuszu, w którym ta procedura jest wywoływana z procedury składowanej SQLCLR, a ograniczenie jest naruszone dla tego argumentu, użytkownik może błędnie otrzymać potwierdzenie systemu, jeśli będzie oczekiwać, że zostanie wyświetlony komunikat o błędzie "naruszenie ograniczeń".

Poniżej przedstawiono przykład procedury SQLCLR, która stanowi naruszenie ograniczeń procedury składowanej:

[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())

                     {

                           …;

                     }

              }

       }

}

Rozwiązanie

Ten problem został rozwiązany w następujących zbiorczych aktualizacjach programu SQL Server:

Zbiorcza aktualizacja 5 dla programu SQL Server 2016 RTM

Zbiorcza aktualizacja 2 dla programu SQL Server 2016 z dodatkiem SP1

Zbiorcza aktualizacja 4 dla programu SQL Server 2014 z dodatkiem Service Pack 2

Uwaga Ta aktualizacja powoduje zwrócenie poprawnego komunikatu o błędzie "naruszenie ograniczeń".

Każda nowa Zbiorcza aktualizacja programu SQL Server zawiera wszystkie poprawki hotfix i poprawki zabezpieczeń uwzględnione w poprzedniej aktualizacji zbiorczej. Zapoznaj się z najnowszymi aktualizacjami zbiorczymi dla programu SQL Server:

Najnowsza Zbiorcza aktualizacja dla programu SQL Server 2016

Najnowsze aktualizacje zbiorcze dla programu SQL Server 2014

Stan

Firma Microsoft potwierdziła, że jest to problem występujący w produktach firmy Microsoft wymienionych w sekcji "dotyczy".

 

Informacje

Dowiedz się więcej o terminologii używanej przez firmę Microsoft do opisywania aktualizacji oprogramowania.

Potrzebujesz dalszej pomocy?

Chcesz uzyskać więcej opcji?

Poznaj korzyści z subskrypcji, przeglądaj kursy szkoleniowe, dowiedz się, jak zabezpieczyć urządzenie i nie tylko.