KB4010162 - PATAISYMAS: Sistemos tvirtinimas įvyksta, kai Transact-SQL saugoma procedūra su TVP argumentu iškviečiama iš SQLCLR procedūros

Taikoma
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

Požymiai

Tarkime, kad turite "Transact-SQL" išsaugotą procedūrą, tokią, kaip toliau pateikta, kuri kaip argumentą naudoja lentelės reikšmių parametrą (TVP), turintį apribojimą:

create type TestTvpType as table

(

id int pirminis raktas, -- UNIQUE taip pat padarys triuką

data int

);

grįžti

create procedure TestTvpProc TestTvpType @tvp tik skaityti

kaip

pradėti

select * from @tvp;

pabaiga;

grįžti

Kai ši procedūra iškviečiama iš SQLCLR išsaugotos procedūros ir pažeidžiamas argumento apribojimas, galite klaidingai gauti sistemos patvirtinimą, nors tikėtumėtės gauti klaidos pranešimą "apribojimo pažeidimas".

      

Toliau pateikiamas pavyzdys, kaip SQLCLR procedūra pažeidė saugomąją procedūrą:

      

[SqlProcedure]

viešoji statinė netektis ClrProcCallingTsqlProcWithTvpArgument(out int sum)

{

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

{

suma = 0;

DataTable myDataTable = new DataTable("TestTvpType");

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

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

Užpildykite TVP, kad jis suaktyvintų PRIMARY KEY VIOLATION klaidą

myDataTable.Rows.Add(1, 1000);

myDataTable.Rows.Add(1, 2000);

SqlParameter parametras = new SqlParameter();

parametrą. ParameterName = "@tvp";

parametrą. SqlDbType = System.Data.SqlDbType.Structured;

parametrą. Value = myDataTable;

SqlCommand command = new SqlCommand("TestTvpProc", ryšys);

komandą. CommandType = CommandType.StoredProcedure;

komandą. Parameters.Add(parametras);

ryšys. Atidaryti ();

naudojant (SqlDataReader skaitytuvas = komanda. ExecuteReader())

{

Nors (skaitytojas. Skaityti ())

{

…;

}

}

}

}

Sprendimas

Ši problema išspręsta šiuose kaupiamuosiuose "„SQL Server“" naujinimuose:

5 kaupiamasis naujinimas, skirtas „SQL Server“ 2016 RTM

2 kaupiamasis naujinimas, skirtas „SQL Server“ 2016 SP1

4 kaupiamasis naujinimas, skirtas "„SQL Server“ 2014" 2 pakeitimų paketui

Atkreipkite dėmesį Dėl šio naujinimo grąžinamas teisingas klaidos pranešimas "constraint violation".

Apie kaupiamuosius „SQL Server“ naujinimus

Kiekviename naujame kaupiamajame „SQL Server“ naujinime yra visos karštosios pataisos ir saugos pataisos, kurios buvo įtrauktos į ankstesnį kaupiamąjį naujinimą. Peržiūrėkite naujausius "„SQL Server“" kaupiamuosius naujinimus:

Naujausias kaupiamasis naujinimas, skirtas „SQL Server“ 2016

Naujausi "„SQL Server“ 2014" kaupiamieji naujinimai

Būsena

„„Microsoft““ patvirtino, kad tai yra „„Microsoft““ produktų, išvardytų dalyje „Taikoma“, problema.

Nuorodos

Sužinokite daugiau apie terminus , kuriuos "„Microsoft“" naudoja apibūdindama programinės įrangos naujinimus.