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