KB4010162 - CORRECTIF : une assertion système se produit lorsqu’une procédure stockée Transact-SQL avec un argument TVP est appelée à partir d’une procédure SQLCLR

S’applique à
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

Symptômes

Supposons que vous disposez d’une procédure stockée Transact-SQL telle que la suivante qui accepte un paramètre table (TVP) qui a une contrainte comme argument :

create type TestTvpType as table

(

id int primary key, -- UNIQUE fera également l’affaire

data int

);

go

create procedure TestTvpProc @tvp TestTvpType en lecture seule

comme

commencer

sélectionnez * à partir de @tvp;

Fin;

go

Dans un scénario où cette procédure est appelée à partir d’une procédure stockée SQLCLR et que la contrainte est violée pour l’argument, vous pouvez recevoir une assertion système de manière incorrecte, alors que vous vous attendiez à recevoir un message d’erreur « violation de contrainte ».

      

Voici un exemple de procédure SQLCLR produisant une violation de contrainte pour la procédure stockée :

      

[SqlProcedure]

public static void ClrProcCallingTsqlProcWithTvpArgument(out int sum)

{

using (connexion SqlConnection = new SqlConnection(« context connection=true »))

{

sum = 0 ;

DataTable myDataTable = new DataTable(« TestTvpType ») ;

myDataTable.Columns.Add(« id », typeof(Int32)) ;

myDataTable.Columns.Add(« data », typeof(Int32)) ;

Remplissez le TVP afin qu’il déclenche une erreur DE VIOLATION DE CLÉ PRIMAIRE

myDataTable.Rows.Add(1, 1000) ;

myDataTable.Rows.Add(1, 2000) ;

Paramètre SqlParameter = new SqlParameter() ;

Paramètre. ParameterName = « @tvp » ;

Paramètre. SqlDbType = System.Data.SqlDbType.Structured ;

Paramètre. Value = myDataTable ;

Commande SqlCommand = new SqlCommand(« TestTvpProc », connection) ;

Commande. CommandType = CommandType.StoredProcedure ;

Commande. Parameters.Add(parameter) ;

Connexion. Open() ;

using (Lecteur SqlDataReader = commande. ExecuteReader())

{

while (lecteur. Read())

{

…;

}

}

}

}

Résolution

Ce problème est résolu dans les mises à jour cumulatives suivantes pour SQL Server :

Mise à jour cumulative 5 pour SQL Server 2016 RTM

Mise à jour cumulative 2 pour SQL Server 2016 SP1

Mise à jour cumulative 4 pour SQL Server Service Pack 2 2014

Note Cette mise à jour provoque le retour du message d’erreur « violation de contrainte » correct.

À propos des mises à jour cumulatives pour SQL Server

Chaque nouvelle mise à jour cumulative pour SQL Server contient tous les correctifs logiciels et correctifs de sécurité inclus dans la mise à jour cumulative précédente. Consultez les dernières mises à jour cumulatives pour SQL Server :

Dernière mise à jour cumulative pour SQL Server 2016

Dernières mises à jour cumulatives pour SQL Server 2014

État

Microsoft a confirmé qu’il s’agissait d’un problème dans les produits Microsoft répertoriés dans la section « S’applique à ».

Références

Découvrez la terminologie utilisée par Microsoft pour décrire les mises à jour logicielles.