症状
假设您有一个 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 2014 Service Pack 2 的累积更新 4
备注 此更新会导致返回正确的“约束冲突”错误消息。
关于 SQL Server 的累积更新
SQL Server 的每个新累积更新都包含上一个累积更新中包含的所有修补程序和安全修补程序。 查看 SQL Server 的最新累积更新:
状态
Microsoft 已确认在 "适用于" 部分中所列的 Microsoft 产品中存在问题。
参考资料
了解 Microsoft 用于描述软件更新的 术语 。