KB4010162 – FIX: Eine Systemassertion tritt auf, wenn eine gespeicherte Transact-SQL-Prozedur mit einem TVP-Argument von einer SQLCLR-Prozedur aufgerufen wird

Gilt für
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

Symptome

Angenommen, Sie verwenden eine gespeicherte Transact-SQL-Prozedur wie die folgende, die einen Tabellenwertparameter (TVP) mit einer Einschränkung als Argument akzeptiert:

Typ TestTvpType als Tabelle erstellen

(

id int primary key, -- UNIQUE reicht ebenfalls aus

data int

);

go

Prozedur erstellen TestTvpProc @tvp TestTvpType schreibgeschützt

als

Anfang

select * from @tvp;

Ende;

go

In einem Szenario, in dem diese Prozedur von einer gespeicherten SQLCLR-Prozedur aufgerufen wird und die Einschränkung für das Argument verletzt wird, erhalten Sie möglicherweise fälschlicherweise eine Systemzusicherung, obwohl Sie eine Fehlermeldung "Einschränkung verletzen" erwarten würden.

      

Im Folgenden finden Sie ein Beispiel für eine SQLCLR-Prozedur, die eine Einschränkungsverletzung für die gespeicherte Prozedur verursacht:

      

[SqlProcedure]

public static void ClrProcCallingTsqlProcWithTvpArgument(out int sum)

{

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

{

Summe = 0;

DataTable myDataTable = new DataTable("TestTvpType");

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

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

Füllen Sie das TVP aus, damit es einen PRIMARY KEY VIOLATION-Fehler auslöst

myDataTable.Rows.Add(1, 1000);

myDataTable.Rows.Add(1, 2000);

SqlParameter parameter = new SqlParameter();

Parameter angezeigt. ParameterName = "@tvp";

Parameter angezeigt. SqlDbType = System.Data.SqlDbType.Structured;

Parameter angezeigt. Wert = myDataTable;

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

Befehl. CommandType = CommandType.StoredProcedure;

Befehl. Parameters.Add(parameter);

Verbindung herstellen. Open();

using (SqlDataReader reader = Befehl. ExecuteReader())

{

Während (Leser. Lesen())

{

…;

}

}

}

}

Lösung

Dieses Problem wurde in den folgenden kumulativen Updates für SQL Server behoben:

Kumulatives Update 5 für SQL Server 2016 RTM

Kumulatives Update 2 für SQL Server 2016 SP1

Kumulatives Update 4 für SQL Server 2014 Service Pack 2

Hinweis Dieses Update bewirkt, dass die korrekte Fehlermeldung "Einschränkung verletzt" angezeigt wird.

Informationen zu kumulativen Updates für SQL Server

Jedes neue kumulative Update für SQL Server enthält alle Hotfixes und Sicherheitsfixes, die im vorherigen kumulativen Update enthalten waren. Sehen Sie sich die neuesten kumulativen Updates für SQL Server an:

Neuestes kumulative Update für SQL Server 2016

Neueste kumulative Updates für SQL Server 2014

Status

Microsoft hat bestätigt, dass dies ein Problem bei den Microsoft-Produkten ist, die im Abschnitt „Gilt für“ aufgeführt sind.

Referenzmaterial

Erfahren Sie mehr über die Terminologie , die Microsoft zum Beschreiben von Softwareupdates verwendet.