Вызов хранимой процедуры из хранимой процедуры CLR с табличным параметром - PullRequest
2 голосов
/ 05 января 2012

Ситуация:

Одна хранимая процедура Clr, которая создает таблицу данных и затем пытается вызвать хранимую процедуру SQL с параметром TVP.

Код:

  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, он начнет работать неправильно.(не могу найти логику и в этом «триггере»)

Есть мысли?Заранее спасибо.

1 Ответ

0 голосов
/ 11 июля 2015

Похоже, что в этой строке есть ошибка.

command.CommandTest = "prc_test";

Измените ее на

command.CommandText = "prc_test";
...