Symptômes
Supposez que vous disposez d’une procédure stockée Transact-SQL telle que la suivante qui accepte un paramètre table (TVP) qui comporte une contrainte en tant qu’argument :
create type TestTvpType as table
(
id int primary key, -- UNIQUE will also do the trick
data int
);
go
create procedure TestTvpProc @tvp TestTvpType readonly
as
begin
select * from @tvp;
end;
go
Dans un scénario dans lequel cette procédure est appelée à partir d’une procédure stockée SQLCLR et que la contrainte est violée pour l’argument, il est possible que vous receviez pas de message une assertion système lors de la réception d’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 (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));
// Populate 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();
parameter.ParameterName = "@tvp";
parameter.SqlDbType = System.Data.SqlDbType.Structured;
parameter.Value = myDataTable;
SqlCommand command = new SqlCommand("TestTvpProc", connection);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add(parameter);
connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
…;
}
}
}
}
Résolution
Ce problème a été résolu dans les mises à jour cumulatives de SQL Server suivantes :
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 2014 Service Pack 2
Remarque cette mise à jour entraîne le renvoi du message d’erreur « violation de contrainte » correct.
Chaque nouvelle mise à jour cumulative pour SQL Server contient tous les correctifs et correctifs de sécurité inclus dans la mise à jour cumulative précédente. Consultez les dernières mises à jour cumulatives pour SQL Server :
Statut
Microsoft a confirmé l’existence de ce problème dans les produits Microsoft figurant dans la liste des produits concernés par cet article.
Références
Apprenez-en davantage sur la terminologie utilisée par Microsoft pour décrire les mises à jour logicielles.