KB4010162 – RJEŠENJE: sistemska tvrdnja pojavljuje se kada se iz SQLCLR procedure pozove pohranjena procedura Transact-SQL s argumentom TVP

Primjenjuje se na
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

Simptomi

Pretpostavimo da imate spremljenu proceduru Transact-SQL, poput ove koja kao argument uzima parametar vrijednosti tablice (TVP) koji ima ograničenje:

create type TestTvpType as table

(

id int primary key, -- UNIQUE će također učiniti trik

data int

);

Idite na

create procedure TestTvpProc @tvp TestTvpType samo za čitanje

kao što je

početak

Odaberite * iz @tvp;

kraj;

Idite na

U scenariju u kojem se ta procedura poziva iz spremljene procedure SQLCLR i ograničenje je prekršeno za argument, možda ćete neispravno primiti sistemsku tvrdnju, iako biste očekivali poruku o pogrešci "kršenje ograničenja".

      

Slijedi primjer SQLCLR procedure koja dovodi do kršenja ograničenja za pohranjenu proceduru:

      

[SqlProcedure]

public static void ClrProcCallingTsqlProcWithTvpArgument(out int sum)

{

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

{

zbroj = 0;

Podatkovna tablica myDataTable = new DataTable("TestTvpType");

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

myDataTable.Columns.Add("podaci"; typeof(Int32));

Popunite TVP tako da pokrene pogrešku POVREDA PRIMARNOG KLJUČA

myDataTable.Rows.Add(1, 1000);

myDataTable.Rows.Add(1, 2000);

SqlParameter parameter = new SqlParameter();

parametra. ParameterName = "@tvp";

parametra. SqlDbType = System.Data.SqlDbType.Structured;

parametra. Vrijednost = myDataTable;

SqlCommand command = new SqlCommand("TestTvpProc", veza);

Naredba. CommandType = CommandType.StoredProcedure;

Naredba. Parameters.Add(parametar);

veza. Open();

pomoću (SqlDataReader reader = naredba. ExecuteReader())

{

while (čitač. Read())

{

…;

}

}

}

}

Rješenje

Taj je problem riješen u sljedećim kumulativnim ažuriranjima za SQL Server:

Kumulativno ažuriranje 5 za SQL Server 2016 RTM

Kumulativno ažuriranje 2 za SQL Server 2016 SP1

Kumulativno ažuriranje 4 za SQL Server 2014 Service Pack 2

Napomena Ovo ažuriranje uzrokuje vraćanje ispravne poruke o pogrešci "kršenje ograničenja".

O kumulativnim ažuriranjima za SQL Server

Svako novo kumulativno ažuriranje za SQL Server sadrži sve hitne popravke i sigurnosne popravke koji su obuhvaćeni prethodnim kumulativnim ažuriranjem. Pogledajte najnovija kumulativna ažuriranja za SQL Server:

Najnovije kumulativno ažuriranje za SQL Server 2016

Najnovija kumulativna ažuriranja za SQL Server 2014

Status

Microsoft je potvrdio da je to problem u Microsoftovim proizvodima koji su navedeni u odjeljku „Odnosi se na“.

Reference

Saznajte više o terminologiji koju Microsoft upotrebljava za opisivanje softverskih ažuriranja.