KB4010162 - FIX: Er treedt een systeembevestiging op wanneer een opgeslagen Transact-SQL-procedure met een TVP-argument wordt aangeroepen vanuit een SQLCLRR-procedure

Van toepassing op
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

Symptomen

Stel dat u een Transact-SQL opgeslagen procedure hebt zoals de volgende, waarbij een tabelwaardeparameter (TVP) met een beperking als argument wordt gebruikt:

create type TestTvpType as table

(

id int primaire sleutel, -- UNIEK is ook voldoende

data int

);

ga

procedure maken TestTvpProc @tvp TestTvpType alleen-lezen

net zo

beginnen

selecteer * van @tvp;

einde;

ga

In een scenario waarin deze procedure wordt aangeroepen vanuit een opgeslagen SQLCLRR-procedure en de beperking voor het argument wordt geschonden, ontvangt u mogelijk ten onrechte een systeembevestiging, terwijl u een foutbericht 'beperking schending' zou verwachten.

      

Hieronder volgt een voorbeeld van een SQLCLR-procedure die een restrictieschending veroorzaakt voor de opgeslagen procedure:

      

[SqlProcedure]

public static void ClrProcCallingTsqlProcWithTvpArgument(out int sum)

{

using (SqlConnection connection = new SqlConnection("context connection=true"))

{

som = 0;

DataTable myDataTable = new DataTable("TestTvpType");

myDataTable.Columns.Add("id", typevan(Int32));

myDataTable.Columns.Add("gegevens", typevan(Int32));

Vul de TVP zodanig in dat er een PRIMARY KEY VIOLATION-fout wordt veroorzaakt

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 = new SqlCommand("TestTvpProc", connection);

commando. CommandType = CommandType.StoredProcedure;

commando. Parameters.Add(parameter);

verbinding. Open();

met (SqlDataReader reader = opdracht. ExecuteReader())

{

terwijl (lezer. Lezen())

{

…;

}

}

}

}

Oplossing

Dit probleem is opgelost in de volgende cumulatieve updates voor SQL Server:

Cumulatieve update 5 voor SQL Server 2016 RTM

Cumulatieve update 2 voor SQL Server 2016 SP1

Cumulatieve update 4 voor SQL Server 2014 Service Pack 2

Notitie Deze update zorgt ervoor dat het juiste foutbericht 'beperking schending' wordt geretourneerd.

Informatie over cumulatieve updates voor SQL Server

Elke nieuwe cumulatieve update voor SQL Server bevat alle hotfixes en beveiligingspatches uit de vorige cumulatieve update. Bekijk de meest recente cumulatieve updates voor SQL Server:

Meest recente cumulatieve update voor SQL Server 2016

Meest recente cumulatieve updates voor SQL Server 2014

Status

Microsoft heeft bevestigd dat dit een probleem is bij de Microsoft-producten die worden vermeld in de sectie Van toepassing op.

Meer informatie

Meer informatie over de terminologie die Microsoft gebruikt om software-updates te beschrijven.