KB4010162 – ÅTGÄRDA: En systemkontroll inträffar när en Transact-SQL-lagrad procedur med ett TVP-argument anropas från en SQLCLR-procedur

Gäller för
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

Symptom

Anta att du har en Transact-SQL-lagrad procedur som följande som tar en tabellvärdesparameter (TVP) som har ett villkor som argument:

skapa typ TestTvpType som tabell

(

id int primärnyckel, -- UNIK kommer också att göra susen

data int

);

skapa procedur TestTvpProc @tvp TestTvpType skrivskyddad

Som framgår av

börja

välj * från @tvp;

slutet;

I ett scenario där den här proceduren anropas från en lagrad SQLCLR-procedur och begränsningen överträds för argumentet, kan du felaktigt få en systemkontroll när du förväntar dig att få ett felmeddelande om "begränsningsöverträdelse".

      

Följande är ett exempel på en SQLCLR-procedur som skapar en begränsningsöverträdelse för den lagrade proceduren:

      

[SqlProcedure]

public static void ClrProcCallingTsqlProcWithTvpArgument(out int sum)

{

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

{

summa = 0;

DataTable myDataTable = new DataTable("TestTvpType");

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

myDataTable.Columns.Add("data", typeof(Int32));

Fyll i TVP så att det utlöser ett fel med PRIMÄRNYCKELFEL

myDataTable.Rows.Add(1, 1000);

myDataTable.Rows.Add(1, 2000);

SqlParameter-parameter = new SqlParameter();

parametern. ParameterName = "@tvp";

parametern. SqlDbType = System.Data.SqlDbType.Structured;

parametern. Värde = myDataTable;

SqlCommand-kommando = nytt SqlCommand("TestTvpProc", anslutning);

kommando. CommandType = CommandType.StoredProcedure;

kommando. Parameters.Add(parameter);

anslutning. Öppna();

using (SqlDataReader reader = kommando. ExecuteReader())

{

While (läsare. Läsa())

{

…;

}

}

}

}

Lösning

Det här problemet åtgärdas i följande kumulativa uppdateringar för SQL Server:

Kumulativ uppdatering 5 för SQL Server 2016 RTM

Kumulativ uppdatering 2 för SQL Server 2016 SP1

Kumulativ uppdatering 4 för SQL Server 2014 Service Pack 2

Anteckning Den här uppdateringen leder till att korrekt felmeddelande om "begränsningsöverträdelse" returneras.

Om kumulativa uppdateringar för SQL Server

Varje ny kumulativ uppdatering för SQL Server innehåller alla snabbkorrigeringar och säkerhetskorrigeringar som ingick i den tidigare kumulativa uppdateringen. Kolla in de senaste kumulativa uppdateringarna för SQL Server:

Senaste kumulativa uppdateringen för SQL Server 2016

Senaste kumulativa uppdateringar för SQL Server 2014

Status

Microsoft har bekräftat att detta är ett problem i de Microsoft-produkter som anges i avsnittet "Gäller".

Referenser

Läs mer om den terminologi som Microsoft använder för att beskriva programuppdateringar.