KB4010162 – LØS: En systemdeklarasjon oppstår når en Transact-SQL-lagret prosedyre med et TVP-argument kalles fra en SQLCLR-prosedyre

Gjelder for
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

Symptomer

Anta at du har en lagret prosedyre for Transact-SQL, for eksempel den følgende, som tar en tabellverdiparameter (TVP) med en begrensning som argument:

opprettingstype TestTvpType som tabell

(

id int primary key, -- UNIQUE vil også gjøre susen

data int

);

opprett prosedyre TestTvpProc @tvp TestTvpType skrivebeskyttet

som

begynn

velg * fra @tvp;

slutt;

I et scenario der denne prosedyren kalles fra en SQLCLR-lagret prosedyre og begrensningen er brutt for argumentet, kan du feilaktig motta en systempåstand, når du forventer å motta feilmeldingen «brudd på begrensning».

      

Følgende er et eksempel på en SQLCLR-prosedyre som produserer et brudd på begrensningene for den lagrede prosedyren:

      

[SqlProcedure]

public static void ClrProcCallingTsqlProcWithTvpArgument(out int sum)

{

ved hjelp av (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));

Fyll ut TVP slik at den utløser en PRIMARY KEY VIOLATION-feil

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);

kommandoen. CommandType = CommandType.StoredProcedure;

kommandoen. Parameters.Add(parameter);

tilkobling. Open();

ved hjelp av (SqlDataReader reader = kommando. ExecuteReader())

{

Mens (leser. Les())

{

…;

}

}

}

}

Oppløsning

Dette problemet er løst i følgende kumulative oppdateringer for SQL Server:

Kumulativ oppdatering 5 for SQL Server 2016 RTM

Kumulativ oppdatering 2 for SQL Server 2016 SP1

Kumulativ oppdatering 4 for SQL Server 2014 Service Pack 2

Vær oppmerksom på Denne oppdateringen fører til at den korrekte feilmeldingen "brudd på begrensning" returneres.

Om kumulative oppdateringer for SQL Server

Hver nye kumulative oppdatering for SQL Server inneholder alle hurtigreparasjoner og sikkerhetsoppdateringer som var inkludert i den forrige kumulative oppdateringen. Ta en titt på de nyeste kumulative oppdateringene for SQL Server:

Den nyeste kumulative oppdateringen for SQL Server 2016

De nyeste kumulative oppdateringene for SQL Server 2014

Status

Microsoft har bekreftet at dette er et problem i Microsoft-produktene som er oppført i delen «Gjelder for».

Kilder

Finn ut mer om terminologien Microsoft bruker til å beskrive programvareoppdateringer.