KB4010162 - OPRAVA: System assert nastane, když je uložená procedura Transact-SQL s argumentem TVP volána z procedury SQLCLR

Platí pro
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

Příznaky

Předpokládejme, že máte uloženou proceduru Transact-SQL, jako je například tato, která přebírá parametr s hodnotou tabulky (TVP), který má jako argument omezení:

vytvořit typ TestTvpType jako tabulku

(

id int primární klíč, -- UNIQUE bude také stačit

data int

);

přejít

create procedure TestTvpProc @tvp TestTvpType readonly

Jako

začít

vyberte * od @tvp;

konec;

přejít

Ve scénáři, kdy je tato procedura volána z uložené procedury SQLCLR a dojde k porušení omezení pro argument, může se vám nesprávně zobrazit systémová kontrola, když byste očekávali chybovou zprávu o porušení omezení.

      

Následuje příklad procedury SQLCLR, která způsobuje porušení omezení uložené procedury:

      

[SqlProcedure]

public static void ClrProcCallingTsqlProcWithTvpArgument(out int sum)

{

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

{

součet = 0;

DataTable: myDataTable = new DataTable("TestTvpType");

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

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

Fill the TVP so it will trigger a PRIMARY KEY VIOLATION Error

myDataTable.Rows.Add(1, 1000);

myDataTable.Rows.Add(1, 2000);

SqlParameter parameter = new SqlParameter();

. ParameterName = "@tvp";

. SqlDbType = System.Data.SqlDbType.Structured;

. Value = myDataTable;

Příkaz SqlCommand = new SqlCommand("TestTvpProc", připojení);

. CommandType = CommandType.StoredProcedure;

. Parameters.Add(parametr);

připojení. Open();

using (SqlDataReader = příkaz. ExecuteReader())

{

zatímco (čtenář. Read())

{

…;

}

}

}

}

Řešení

Tento problém je opravený v následujících kumulativních aktualizacích pro SQL Server:

Kumulativní aktualizace 5 pro SQL Server 2016 RTM

Kumulativní aktualizace 2 pro SQL Server 2016 SP1

Kumulativní aktualizace 4 pro SQL Server 2014 Service Pack 2

Poznámka Tato aktualizace způsobí vrácení správné chybové zprávy o porušení omezení.

Informace o kumulativních aktualizacích pro SQL Server

Každá nová kumulativní aktualizace pro SQL Server obsahuje všechny opravy hotfix a opravy zabezpečení, které byly součástí předchozí kumulativní aktualizace. Podívejte se na nejnovější kumulativní aktualizace pro SQL Server:

Nejnovější kumulativní aktualizace pro SQL Server 2016

Nejnovější kumulativní aktualizace pro SQL Server 2014

Stav

Společnost Microsoft potvrdila, že se jedná o problém produktů Microsoft, které jsou uvedeny v sekci Platí pro.

Reference

Přečtěte si o terminologii , kterou společnost Microsoft používá k popisování aktualizací softwaru.