KB4010162 - CORRECCIÓN: se produce una aserción del sistema cuando se llama a un procedimiento almacenado de Transact-SQLTransact-SQL con un argumento TVP desde un procedimiento SQLCLR

Se aplica 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

Síntomas

Suponga que tiene un procedimiento almacenado transact-SQLTransact-SQL como el siguiente que toma un parámetro con valores de tabla (TVP) que tiene una restricción como argumento:

crear tipo TestTvpType como tabla

(

id int primary key, -- UNIQUE también hará el truco

data int

);

go

create procedure TestTvpProc @tvp TestTvpType readonly

como

begin

seleccionar * desde @tvp;

fin;

go

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

      

A continuación se muestra 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"))

{

suma = 0;

DataTable myDataTable = new DataTable("TestTvpType");

myDataTable.Columns.Add("id", typeof(Int32));

myDataTable.Columns.Add("data", typeof(Int32));

Rellenar el TVP para que se desencadene un error DE INFRACCIÓN DE CLAVE PRINCIPAL

myDataTable.Rows.Add(1, 1000);

myDataTable.Rows.Add(1, 2000);

Parámetro SqlParameter = new SqlParameter();

parámetro. ParameterName = "@tvp";

parámetro. SqlDbType = System.Data.SqlDbType.Structured;

parámetro. Value = myDataTable;

Comando SqlCommand = nuevo SqlCommand("TestTvpProc", conexión);

comando. CommandType = CommandType.StoredProcedure;

comando. Parameters.Add(parameter);

conexión. Abrir();

mediante el comando (Lector de SqlDataReader = ). ExecuteReader())

{

mientras (lector. Read())

{

…;

}

}

}

}

Resolució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 el Service Pack 2 de SQL Server 2014

Nota Esta actualización hace que se devuelva el mensaje de error "infracción de restricción" correcto.

Acerca de las actualizaciones acumulativas para SQL Server

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. Echa un vistazo a las últimas actualizaciones acumulativas de SQL Server:

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

Actualizaciones acumulativas más recientes para SQL Server 2014

Estado

Microsoft ha confirmado que se trata de un problema de los productos de Microsoft que se enumeran en la sección "Aplicable a".

Referencias

Obtén información sobre la terminología que Microsoft usa para describir las actualizaciones de software.