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) ,该参数将约束作为参数:

创建类型 TestTvpType 作为表

(

id int 主键, -- UNIQUE 也将执行技巧

data int

);

转到

创建过程 TestTvpProc @tvp TestTvpType readonly

as

开始

select * from @tvp;

结束;

转到

在从 SQLCLR 存储过程调用此过程并违反参数的约束的情况下,当预期收到“约束冲突”错误消息时,可能会错误地收到系统断言。

      

下面是 SQLCLR 过程为存储过程生成约束冲突的示例:

      

[SqlProcedure]

public static void ClrProcCallingTsqlProcWithTvpArgument (out int sum)

{

using (SqlConnection 连接 = 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,使其触发主键冲突错误

myDataTable.Rows.Add (1, 1000) ;

myDataTable.Rows.Add (1, 2000) ;

SqlParameter 参数 = 新的 SqlParameter () ;

参数。ParameterName = “@tvp”;

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

参数。值 = myDataTable;

SqlCommand 命令 = 新的 SqlCommand (“TestTvpProc”,连接) ;

命令。CommandType = CommandType.StoredProcedure;

命令。Parameters.Add (parameter) ;

连接。打开 () ;

using (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用于描述软件更新 的术语