KB4010162 - REMEDIERE: O afirmare de sistem apare atunci când este apelată o procedură stocată Transact-SQL cu un argument TVP dintr-o procedură SQLCLR

Se aplică la
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

Simptome

Să presupunem că aveți o procedură stocată Transact-SQL, cum ar fi următoarea, care preia un parametru cu valoare tabel (TVP) care are o restricție ca argument:

creare tip TestTvpType as table

(

id int cheia primară, -- UNIQUE va fi de asemenea suficientă

date int

);

salt

procedură de creare TestTvpProc @tvp TestTvpType readonly

ca

început

select * from @tvp;

sfârșit;

salt

Î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 aserțiune de sistem atunci când v-ați aștepta să primiți un mesaj de eroare "încălcare restricție".

      

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

      

[Procedură SQL]

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("date", typeof(Int32));

Populați TVP-ul astfel încât să declanșeze o eroare PRIMARY KEY VIOLATION

myDataTable.Rows.Add(1, 1000);

myDataTable.Rows.Add(1, 2000);

Parametru SqlParameter = new SqlParameter();

parametru. ParameterName = "@tvp";

parametru. SqlDbType = System.Data.SqlDbType.Structured;

parametru. Valoare = TabelDataMea;

Comanda SqlCommand = new SqlCommand("TestTvpProc", conexiune);

comandă. CommandType = CommandType.StoredProcedure;

comandă. Parameters.Add(parametru);

conexiunea. Open();

using (SqlDataReader reader = command. ExecuteReader())

{

while (cititor. 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 provoacă returnarea mesajului de eroare corect "încălcare restricție".

Despre actualizările cumulative pentru SQL Server

Fiecare actualizare cumulativă nouă pentru SQL Server conține toate remedierile rapide și remedierile 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 care sunt listate în secțiunea „Se aplică la”.

Referințe

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