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 argumento:
criar tipo TestTvpType como tabela
(
id int primary key, -- UNIQUE também resolverá o problema
Data int
);
vá
procedimento de criação TestTvpProc @tvp TestTvpType readonly
como
começar
select * from @tvp;
fim;
vá
Em um cenário em que esse procedimento é chamado de um procedimento armazenado SQLCLR e a restrição é violada para o argumento, você pode receber incorretamente uma declaração do sistema, quando esperaria 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:
[Procedimento Sql]
public static void ClrProcCallingTsqlProcWithTvpArgument(out int sum)
{
usando (SqlConnection connection = new SqlConnection("context connection=true"))
{
soma = 0;
DataTable myDataTable = new DataTable("TestTvpType");
myDataTable.Columns.Add("id", typeof(Int32));
myDataTable.Columns.Add("data", typeof(Int32));
Preencha o TVP para que ele dispare um erro de VIOLAÇÃO DE CHAVE PRIMÁRIA
myDataTable.Rows.Add(1, 1000);
myDataTable.Rows.Add(1, 2000);
Parâmetro SqlParâmetro = novo SqlParameter();
parâmetro. ParameterName = "@tvp";
parâmetro. SqlDbType = System.Data.SqlDbType.Structured;
parâmetro. Valor = myDataTable;
Comando Sql = new Comando SQL("TestTvpProc", conexão);
comando. CommandType = CommandType.StoredProcedure;
comando. Parameters.Add(parâmetro);
conexão. Open();
using (SqlDataReader reader = command. ExecuteReader())
{
while (leitor. read())
{
…;
}
}
}
}
Resolução
Esse problema é corrigido nas seguintes atualizações cumulativas para o SQL Server:
Atualização cumulativa 5 para o SQL Server 2016 RTM
Atualização cumulativa 2 para o SQL Server 2016 SP1
Atualização cumulativa 4 para o SQL Server 2014 Service Pack 2
Observação Esta atualização causa o retorno da mensagem de erro "violação de restrição" correta.
Sobre atualizações cumulativas para o SQL Server
Cada nova atualização cumulativa do SQL Server contém todos os hotfixes e correções de segurança incluídos na atualização cumulativa anterior. Confira as atualizações cumulativas mais recentes para o SQL Server:
Atualização cumulativa mais recente do SQL Server 2016
Atualizações cumulativas mais recentes do SQL Server 2014
Status
A Microsoft confirmou que este é um problema nos produtos da Microsoft listados na seção "Aplica-se a".
Referências
Saiba mais sobre a terminologia que a Microsoft usa para descrever atualizações de software.