KB4010162 - CORREÇÃO: uma declaração do sistema ocorre quando um procedimento armazenado Transact-SQL com um argumento TVP é chamado de um procedimento SQLCLR

Aplica-se a
SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Enterprise Core - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use) SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use) SQL Server 2016 Service Pack 1

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

);

procedimento de criação TestTvpProc @tvp TestTvpType readonly

como

começar

select * from @tvp;

fim;

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.