KB4010162 – ISPRAVKA: Do sistemske tvrdnje dolazi kada se Transact-SQL uskladištena procedura sa TVP argumentom poziva iz SQLCLR procedure

Primenjuje 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 Transact-SQL uskladištenu proceduru poput sledeće koja uzima parametar vrednosti tabele (TVP) koji ima ograničenje kao argument:

create type TestTvpType as table

(

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

data int

);

Idi

create procedure TestTvpProc @tvp TestTvpType samo za čitanje

kao

begin

select * from @tvp;

kraj;

Idi

U scenariju u kojem se ova procedura poziva iz SQLCLR uskladištene procedure, a ograničenje je prekršeno za argument, možete pogrešno da dobijete sistemsku tvrdnju, a očekujete da primite poruku o grešci "kršenje ograničenja".

      

Sledi primer SQLCLR procedure koja proizvodi kršenje ograničenja za uskladištenu proceduru:

      

[SqlProcedure]

public static void ClrProcCallingTsqlProcWithTvpArgument(out int sum)

{

korišćenje (SqlConnection veza = new SqlConnection("context connection=true"))

{

zbir = 0;

DataTable myDataTable = new DataTable("TestTvpType");

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

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

Popunite TVP tako da će aktivirati grešku KRŠENJE PRIMARNOG KLJUČA

myDataTable.Rows.Add(1, 1000);

myDataTable.Rows.Add(1, 2000);

SqlParameter parameter = new SqlParameter();

parametar. ParameterName = "@tvp";

parametar. SqlDbType = System.Data.SqlDbType.Structured;

parametar. Value = myDataTable;

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

komande. CommandType = CommandType.StoredProcedure;

komande. Parameters.Add(parametar);

veza. Open();

korišćenje (SqlDataReader reader = komanda. ExecuteReader())

{

while (Reader. Read())

{

…;

}

}

}

}

Rešenje

Ovaj problem je rešen u sledećim kumulativnim ispravkama za SQL Server:

Kumulativna ispravka 5 za SQL Server 2016 RTM

Kumulativna ispravka 2 za SQL Server 2016 SP1

Kumulativna ispravka 4 za SQL Server 2014 servisni paket 2

Napomena Ova ispravka vraća tačnu poruku o grešci "kršenje ograničenja".

Osnovni podaci o kumulativnim ispravkama za SQL Server

Svaka nova kumulativna ispravka za SQL Server sadrži sve hitne i bezbednosne ispravke koje su uključene u prethodnu kumulativnu ispravku. Pogledajte najnovije kumulativne ispravke za SQL Server:

Najnovija kumulativna ispravka za SQL Server 2016

Najnovije kumulativne ispravke za SQL Server 2014

Status

Microsoft je potvrdio da je ovo problem u Microsoft proizvodima koji su navedeni u odeljku „Odnosi se na“.

Reference

Saznajte više o terminologiji koju Microsoft koristi za opis softverskih ispravki.