情况:
一个 Clr 存储过程,它构建数据表,然后尝试使用 TVP 参数调用 SQL 存储过程。
编码:
public class tvp_test : System.Data.DataTable
{
public tvp_test()
{
this.Column.Add("field1",typeof(System.Int32));
this.Column.Add("field2",typeof(System.Int32));
}
}
.............................................................
{
var tvp = new tvp_test();
.............................................................
using(SqlConnection con = new SqlConnection("context connection=true"))
{
con.Open();
var command = con.CreateCommand();
command.CommandType = CommandType.StoredProcedure;
command.CommandTest = "prc_test";
command.Parameters.Add("@a",System.Data.SqlDbType.Structured);
command.Parameters["@a"].Value = tvp;
command.ExecuteNonQuery();
con.Close();
}
}
..................................................... .....................
create procedure prc_test
@a tvp_test readonly
begin
insert into #tmp (field1,field2) /* #tmp is created before the call of the CLR SP */
select field1,field2 from @a
end
问题:
行为不稳定。有一次它起作用,在 x(其中 x 是随机的)调用之后,它会给我 y(其中 y 是随机的)“发生严重错误”,没有其他细节,之后循环将重新开始。据我所知,问题出在 CLR SP 方面,因为当错误开始发生时,SQL SP 可以更改并出现故障,因为错误保持不变。也许CLR SP和TVP之间没有爱,但我没有找到任何参考。
附带说明一下,当它工作时,它可能会工作很长时间,但如果我删除 SP 计划,它就会开始出现故障。(在那个“触发器”中也找不到逻辑)
有什么想法吗 ?先感谢您。