Проблемы
Предположим, что у вас есть хранимая процедура Transact-SQL, например Следующая, которая принимает возвращающий табличное значение параметр (TVP) с ограничением аргумента:
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
В сценарии, в котором эта процедура вызывается из хранимой процедуры SQLCLR, и нарушение ограничения для аргумента, при появлении сообщения об ошибке "нарушение ограничения" может возникнуть ошибочное получение системного утверждения.
Ниже приведен пример процедуры SQLCLR, которая вызывает нарушение ограничения для хранимой процедуры.
[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())
{
…;
}
}
}
}
Решение
Эта проблема исправлена в перечисленных ниже накопительных обновлениях для SQL Server.
Накопительное обновление 5 для SQL Server 2016 RTM
Накопительное обновление 2 для SQL Server 2016 с пакетом обновления 1 (SP1)
Накопительное обновление 4 для SQL Server 2014 с пакетом обновления 2
Примечание . Это обновление приводит к возвращению правильного сообщения об ошибке "нарушение ограничения".
Все новые накопительные обновления для SQL Server содержат все исправления и исправления для системы безопасности, включенные в предыдущий накопительный пакет обновления. Ознакомьтесь с самыми последними накопительными обновлениями для SQL Server.
Статус
Корпорация Майкрософт подтверждает наличие этой проблемы в своих продуктах, которые перечислены в разделе "Применяется к".
Ссылки
Ознакомьтесь с терминологией , которую корпорация Майкрософт использует для описания обновлений программного обеспечения.