Applies ToSQL 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

Problembeschreibung

Angenommen, Sie verfügen über eine gespeicherte Transact-SQL-Prozedur wie die folgende, die einen Tabellenwertparameter (TVP) mit einer Einschränkung als Argument annimmt:

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

In einem Szenario, in dem diese Prozedur von einer gespeicherten SQLCLR-Prozedur aufgerufen wird und die Einschränkung für das Argument verletzt wird, erhalten Sie möglicherweise fälschlicherweise ein System Assert, wenn Sie erwarten, dass eine Fehlermeldung "Einschränkungsverletzung" angezeigt wird.

Der folgende Code ist ein Beispiel für eine SQLCLR-Prozedur, die eine Einschränkungsverletzung für die gespeicherte Prozedur erzeugt:

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

                     {

                           …;

                     }

              }

       }

}

Lösung

Dieses Problem wurde in den folgenden kumulativen Updates für SQL Server behoben:

Kumulatives Update 5 für SQL Server 2016 RTM

Kumulatives Update 2 für SQL Server 2016 SP1

Kumulatives Update 4 für SQL Server 2014 Service Pack 2

Hinweis: dieses Update bewirkt, dass die Fehlermeldung "Einschränkungsverletzung" zurückgegeben wird.

Jedes neue kumulative Update für SQL Server enthält alle Hotfixes und Sicherheitsupdates, die im vorherigen kumulativen Update enthalten waren. Schauen Sie sich die neuesten kumulativen Updates für SQL Server an:

Neuestes Kumulatives Update für SQL Server 2016

Aktuelle kumulative Updates für SQL Server 2014

Status

Microsoft hat bestätigt, dass es sich hierbei um ein Problem bei den in diesem Artikel genannten Microsoft-Produkten handelt.

 

Informationsquellen

Informieren Sie sich über die Terminologie , die Microsoft zum Beschreiben von Softwareupdates verwendet.

Benötigen Sie weitere Hilfe?

Möchten Sie weitere Optionen?

Erkunden Sie die Abonnementvorteile, durchsuchen Sie Trainingskurse, erfahren Sie, wie Sie Ihr Gerät schützen und vieles mehr.