KB4010162 - 修复:从 SQLCLR 过程调用具有 TVP 参数的 Transact-SQL 存储过程时,会发生系统断言

应用对象
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

症状

假设您有一个 Transact-SQL 存储过程,如下所示,它采用以约束作为参数的 TVP) (表值参数:

create type TestTvpType as table

(

id int primary key, -- UNIQUE 也可以解决问题

data int

);

转到

create procedure TestTvpProc @tvp TestTvpType readonly

as

开始

select * from @tvp;

end;

转到

在从 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) ) ;

填充 TVP,以便它触发 PRIMARY KEY VIOLATION 错误

myDataTable.Rows.Add (1, 1000) ;

myDataTable.Rows.Add (1, 2000) ;

SqlParameter parameter = new SqlParameter () ;

参数。ParameterName = “@tvp”;

参数。SqlDbType = System.Data.SqlDbType.Structured;

参数。值 = myDataTable;

SqlCommand command = new SqlCommand (“TestTvpProc”, 连接) ;

命令。CommandType = CommandType.StoredProcedure;

命令。Parameters.Add (parameter) ;

连接。打开 () ;

使用 (SqlDataReader reader = 命令。ExecuteReader () )

{

同时 (阅读器。阅读 () )

{

…;

}

}

}

}

解决方法

此问题已在 SQL Server 的以下累积更新中修复:

SQL Server 2016 RTM 的累积更新 5

SQL Server 2016 SP1 累积更新 2

SQL Server 2014 Service Pack 2 的累积更新 4

备注 此更新会导致返回正确的“约束冲突”错误消息。

关于 SQL Server 的累积更新

SQL Server 的每个新累积更新都包含上一个累积更新中包含的所有修补程序和安全修补程序。 查看 SQL Server 的最新累积更新:

SQL Server 2016 的最新累计更新

SQL Server 2014 的最新累计更新

状态

Microsoft 已确认在 "适用于" 部分中所列的 Microsoft 产品中存在问题。

参考资料

了解 Microsoft 用于描述软件更新的 术语 。