Sintomi
Si supponga di avere una stored procedure Transact-SQL, ad esempio la seguente che accetta un parametro con valori di tabella (TVP) che contiene un vincolo come argomento:
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
In uno scenario in cui questa routine viene chiamata da una stored procedure SQLCLR e il vincolo viene violato per l'argomento, è possibile che venga visualizzato erroneamente un asserzione di sistema, quando si prevede di ricevere un messaggio di errore "violazione di vincoli".
Di seguito è riportato un esempio di procedura SQLCLR che produce una violazione del vincolo per la stored procedure:
[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())
{
…;
}
}
}
}
Risoluzione
Questo problema è stato risolto negli aggiornamenti cumulativi seguenti per SQL Server:
Aggiornamento cumulativo 5 per SQL Server 2016 RTM
Aggiornamento cumulativo 2 per SQL Server 2016 SP1
Aggiornamento cumulativo 4 per SQL Server 2014 Service Pack 2
Nota questo aggiornamento fa sì che venga restituito il messaggio di errore "violazione di vincolo" corretto.
Ogni nuovo aggiornamento cumulativo per SQL Server contiene tutti gli aggiornamenti rapidi e le correzioni di sicurezza inclusi nell'aggiornamento cumulativo precedente. Vedere gli ultimi aggiornamenti cumulativi per SQL Server:
Stato
Microsoft ha confermato che questo problema si verifica nei prodotti elencati nella sezione "Si applica a".
Riferimenti
Informazioni sulla terminologia utilizzata da Microsoft per descrivere gli aggiornamenti software.