KB4010162-remediere: o afirmație de sistem apare atunci când o procedură stocată Transact-SQL cu un argument TVP este apelată dintr-o procedură SQLCLR

Simptome

Să presupunem că aveți o procedură stocată Transact-SQL, cum ar fi următoarele, care necesită un parametru tabel-valoare (TVP) care are o restricție ca 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

Într-un scenariu în care această procedură este apelată dintr-o procedură stocată SQLCLR și restricția este încălcată pentru argument, este posibil să primiți incorect o afirmație de sistem atunci când vă așteptați să primiți un mesaj de eroare "încălcare restricție".

Iată un exemplu de procedură SQLCLR care produce o încălcare a restricțiilor pentru procedura stocată:

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

                     {

                           …;

                     }

              }

       }

}

Rezolvare

Această problemă este remediată în următoarele actualizări cumulative pentru SQL Server:

Actualizarea cumulativă 5 pentru SQL Server 2016 RTM

Actualizarea cumulativă 2 pentru SQL Server 2016 SP1

Actualizarea cumulativă 4 pentru SQL Server 2014 Service Pack 2

Notă această actualizare determină returnarea mesajului de eroare "încălcare restricție corectă".

Fiecare nouă actualizare cumulativă pentru SQL Server conține toate remedierile rapide și de securitate care au fost incluse în actualizarea cumulativă anterioară. Consultați cele mai recente actualizări cumulative pentru SQL Server:

Cea mai recentă actualizare cumulativă pentru SQL Server 2016

Cele mai recente actualizări cumulative pentru SQL Server 2014

Stare

Microsoft a confirmat că aceasta este o problemă în produsele Microsoft enumerate în secțiunea „Se aplică la”.

 

Referințe

Aflați despre terminologia pe care o utilizează Microsoft pentru a descrie actualizările de software.

Aveți nevoie de ajutor suplimentar?

Extindeți-vă competențele
Explorați instruirea
Fiți primul care obține noile caracteristici
Alăturați-vă la Microsoft Insider

V-a fost de ajutor această informație?

Vă mulțumim pentru feedback!

Vă mulțumim pentru feedback! Se pare că ar fi util să luați legătura cu unul dintre agenții noștri de asistență Office.

×