KB4010162 – OPRAVA: Systémové tvrdenie nastane pri volaní uloženej procedúry Transact-SQL s argumentom TVP z procedúry SQLCLR

Vzťahuje sa 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

Príznaky

Predpokladajme, že máte uloženú procedúru Transact-SQL, napríklad nasledujúca, ktorá používa parameter s hodnotou tabuľky (TVP) s obmedzením ako argument:

create type TestTvpType as table

(

id int primary key, -- UNIQUE tiež urobí trik

data int

);

prejsť

create procedure: TestTvpProc @tvp TestTvpType readonly

ako

začať

vybrať * od @tvp;

koniec;

prejsť

V scenári, keď sa táto procedúra volá z uloženej procedúry SQLCLR a obmedzenie pre argument je porušené, sa môže nesprávne zobraziť systémové tvrdenie, pričom by ste očakávali zobrazenie chybového hlásenia o porušení obmedzenia.

      

Toto je príklad procedúry SQLCLR, ktorá vytvára porušenie obmedzenia pre uloženú procedúru:

      

[Procedúra SQL]

public static void ClrProcCallingTsqlProcWithTvpArgument(out int sum)

{

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

{

súčet = 0;

DataTable myDataTable = new DataTable("TestTvpType");

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

myDataTable.Columns.Add("údaje", typeof(Int32));

Vyplňte TVP tak, aby sa spustila chyba PORUŠENIA PRIMÁRNEHO KĽÚČA

myDataTable.Rows.Add(1, 1000);

myDataTable.Rows.Add(1, 2000);

SqlParameter parameter = new SqlParameter();

. ParameterName = "@tvp";

. SqlDbType = System.Data.SqlDbType.Structured;

. Value = myDataTable;

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

. CommandType = CommandType.StoredProcedure;

. Parameters.Add(parameter);

pripojenie. Open();

pomocou príkazu (SqlDataReader reader = príkaz. ExecuteReader())

{

while (čítač. Read())

{

…;

}

}

}

}

Riešenie

Tento problém je opravený v nasledujúcich kumulatívnych aktualizáciách pre SQL Server:

Kumulatívna aktualizácia 5 pre SQL Server 2016 RTM

Kumulatívna aktualizácia 2 pre SQL Server 2016 SP1

Kumulatívna aktualizácia 4 pre balík Service Pack 2 pre SQL Server 2014

Poznámka Táto aktualizácia spôsobuje vrátenie správneho chybového hlásenia o porušení obmedzenia.

Informácie o kumulatívnych aktualizáciách pre SQL Server

Každá nová kumulatívna aktualizácia SQL Server obsahuje všetky rýchle opravy a opravy zabezpečenia, ktoré boli zahrnuté v predchádzajúcej kumulatívnej aktualizácii. Pozrite si najnovšie kumulatívne aktualizácie pre SQL Server:

Najnovšia kumulatívna aktualizácia pre SQL Server 2016

Najnovšie kumulatívne aktualizácie pre SQL Server 2014

Stav

Spoločnosť Microsoft potvrdila, že ide o problém v produktoch spoločnosti Microsoft, ktoré sú uvedené v časti Vzťahuje sa na.

Odkazy

Získajte informácie o terminológii , ktorú Microsoft používa na popis aktualizácií softvéru.