Applies ToSQL 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 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:

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 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.

Precisa de mais ajuda?

Quer mais opções

Explore os benefícios da assinatura, procure cursos de treinamento, saiba como proteger seu dispositivo e muito mais.

As comunidades ajudam você a fazer e responder perguntas, fazer comentários e ouvir especialistas com conhecimento avançado.