Sintomas
Suponha que você tenha um procedimento armazenado Transact-SQL, como o seguinte, que usa um parâmetro com valor de tabela (TVP) que tem uma restrição como um argumento:
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
Em um cenário em que esse procedimento é chamado a partir de um procedimento armazenado SQLCLR e a restrição seja violada para o argumento, você pode receber incorretamente uma declaração do sistema, quando esperar receber uma mensagem de erro de "violação de restrição".
Veja a seguir um exemplo de um procedimento SQLCLR que produz uma violação de restrição para o procedimento armazenado:
[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())
{
…;
}
}
}
}
Resolução
Esse problema foi corrigido nas seguintes atualizações cumulativas do SQL Server:
Atualização cumulativa 5 para SQL Server 2016 RTM
Atualização cumulativa 2 para SQL Server 2016 SP1
Atualização cumulativa 4 para SQL Server 2014 Service Pack 2
Observação esta atualização causa o retorno da mensagem de erro "violação de restrição" correta.
Cada nova atualização cumulativa do SQL Server contém todos os hotfixes e correções de segurança que foram incluídos na atualização cumulativa anterior. Confira as atualizações cumulativas mais recentes do SQL Server:
Status
A Microsoft confirmou que este é um problema nos produtos Microsoft que estão listados na seção "Aplicável a".
Referências
Saiba mais sobre a terminologia usada pela Microsoft para descrever atualizações de software.