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.