KB4010162 – RETTELSE: Et systemassert opstår, når en gemt Transact-SQL-procedure med et TVP-argument kaldes fra en SQLCLR-procedure

Gælder 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

Antag, at du har en gemt Transact-SQL-procedure som denne, der benytter en tabelværdiparameter (TVP) med en begrænsning som argument:

create type TestTvpType as table

(

id int primary key, -- ENTYDIGE gør også tricket

data int

);

gå

create procedure TestTvpProc @tvp TestTvpType skrivebeskyttet

som

begynd

vælg * fra @tvp;

slut;

gå

I et scenarie, hvor denne procedure kaldes fra en SQLCLR-gemt procedure, og betingelsen overtrædes for argumentet, kan du fejlagtigt modtage en systempåstand, selvom du forventer at modtage en fejlmeddelelse om "overtrædelse af begrænsning".

      

Følgende er et eksempel på en SQLCLR-procedure, der medfører en begrænsningsovertrædelse for den lagrede procedure:

      

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

Udfyld TVP'en, så den udløser fejlen PRIMARY KEY VIOLATION

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

forbindelse. Open();

ved hjælp af (SqlDataReader reader = kommando. ExecuteReader())

{

Mens (læser. Read())

{

…;

}

}

}

}

Løsning

Dette problem er rettet i følgende kumulative opdateringer til SQL Server:

Kumulativ opdatering 5 til SQL Server 2016 RTM

Samlet opdatering 2 til SQL Server 2016 SP1

Samlet opdatering 4 til SQL Server 2014 Service Pack 2

Bemærk Denne opdatering medfører, at den korrekte fejlmeddelelse "overtrædelse af begrænsning" returneres.

Om kumulative opdateringer til SQL Server

Hver ny kumulativ opdatering til SQL Server indeholder alle de programrettelser og sikkerhedsrettelser, der var inkluderet i den forrige kumulative opdatering. Se de seneste kumulative opdateringer til SQL Server:

Seneste kumulative opdatering til SQL Server 2016

Seneste kumulative opdateringer til SQL Server 2014

Status

Microsoft har bekræftet, at dette er et problem i de Microsoft-produkter, der er angivet i afsnittet "Gælder for".

Referencer

Læs mere om den terminologi , Microsoft bruger til at beskrive softwareopdateringer.