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

Síntomas

Suponga que tiene un procedimiento almacenado de Transact-SQL como el siguiente que toma un parámetro con valores de tabla (TVP) que tiene una restricción como 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

En un escenario en el que se llama a este procedimiento desde un procedimiento almacenado SQLCLR y se infringe la restricción para el argumento, es posible que reciba incorrectamente una aserción del sistema, cuando esperaría recibir un mensaje de error "infracción de la restricción".

El siguiente es un ejemplo de un procedimiento SQLCLR que produce una infracción de restricción para el procedimiento almacenado:

[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())

                     {

                           …;

                     }

              }

       }

}

Solución

Este problema se ha corregido en las siguientes actualizaciones acumulativas para SQL Server:

Actualización acumulativa 5 para SQL Server 2016 RTM

Actualización acumulativa 2 para SQL Server 2016 SP1

Actualización acumulativa 4 para SQL Server 2014 Service Pack 2

Nota esta actualización provoca el retorno del mensaje de error "infracción de la restricción".

Cada nueva actualización acumulativa de SQL Server contiene todas las revisiones y correcciones de seguridad que se incluyeron en la actualización acumulativa anterior. Consulte las últimas actualizaciones acumulativas para SQL Server:

Actualización acumulativa más reciente de SQL Server 2016

Actualizaciones acumulativas más recientes de SQL Server 2014

Estado

Microsoft ha confirmado que se trata de un problema de los productos de Microsoft recogidos en la sección "Se aplica a".

 

Referencias

Obtenga más información sobre la terminología que Microsoft usa para describir las actualizaciones de software.

¿Necesita más ayuda?

¿Quiere más opciones?

Explore las ventajas de las suscripciones, examine los cursos de aprendizaje, aprenda a proteger su dispositivo y mucho más.

Las comunidades le ayudan a formular y responder preguntas, enviar comentarios y leer a expertos con conocimientos extensos.