KB4010162 – FIX: Eine Systembestätigung tritt auf, wenn eine gespeicherte Transact-SQL-Prozedur mit einem TVP-Argument aus 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 verfügen über eine gespeicherte Transact-SQL-Prozedur wie die folgende, die einen Tabellenwertparameter (Table-Valued Parameter, TVP) akzeptiert, der eine Einschränkung als Argument aufweist:

Erstellen des Typs TestTvpType als Tabelle

(

id int primärer Schlüssel, -- UNIQUE führt auch den Trick aus

data int

);

go

Erstellen der Prozedur TestTvpProc @tvp TestTvpType readonly

als

Anfang

Wählen Sie * aus @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 Systembestätigung, wenn Sie erwarten würden, dass die Fehlermeldung "Einschränkungsverletzung" angezeigt wird.

      

Es folgt ein Beispiel für eine SQLCLR-Prozedur, die eine Einschränkungsverletzung für die gespeicherte Prozedur erzeugt:

      

[SqlProcedure]

public static void ClrProcCallingTsqlProcWithTvpArgument(out int sum)

{

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

{

sum = 0;

DataTable myDataTable = new DataTable("TestTvpType");

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

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

Füllen Sie das TVP auf, damit ein PRIMÄRSCHLÜSSELVERLETZUNGsfehler ausgelöst wird.

myDataTable.Rows.Add(1, 1000);

myDataTable.Rows.Add(1, 2000);

SqlParameter-Parameter = new SqlParameter();

Parameter. ParameterName = "@tvp";

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

Parameter. Value = myDataTable;

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

Befehl. CommandType = CommandType.StoredProcedure;

Befehl. Parameters.Add(parameter);

Verbindung. Open();

using (SqlDataReader reader = command. ExecuteReader())

{

while (reader. Read())

{

…;

}

}

}

}

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 richtige Fehlermeldung "Einschränkungsverletzung" zurückgegeben wird.

Informationen zu kumulativen Updates für SQL Server

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

Neuestes kumulatives 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.