Привязка пустого списка или нулевого значения к табличному параметру хранимой процедуры (.net) - PullRequest
58 голосов
/ 02 сентября 2010

Я создал хранимую процедуру, которая принимает табличный параметр, который представляет собой таблицу с одним столбцом типа int.Идея состоит в том, чтобы просто передать список идентификаторов в процедуру хранилища и позволить sp работать с данными.Однако в случае, когда нет данных для передачи, я сталкиваюсь с проблемами (все работает правильно, когда у меня есть данные).Я преобразую список в IEnumerable и связываю его с табличным параметром для sp.Я попытался связать пустой список, что привело к ошибке

System.ArgumentException: в перечислении SqlDataRecord нет записей.Чтобы отправить табличный параметр без строк, используйте вместо него нулевую ссылку.

Затем я попытался связать нулевое значение (что, как мне показалось, было тем, к чему стремилось указанное выше сообщение), ноприводило только к другому сообщению об ошибке

System.NotSupportedException: значение DBNull для параметра '@MainItemIdList' не поддерживается.Табличными параметрами не может быть DBNull.

Не представляется, что табличный параметр можно объявить как обнуляемый в объявлении sp.Как правильно связать пустой список с табличным параметром?

Ответы [ 4 ]

82 голосов
/ 24 мая 2011

Хитрость в том, что вообще не передает параметр .Значением по умолчанию для параметра с табличным значением является пустая таблица.

Жаль, что сообщение об исключении так бесполезно.

3 голосов
/ 19 января 2019

Не передавая значение работает , но не в случае, когда у меня было несколько параметров табличных значений для передачи в процедуру.Я решил, что нужно указать значение DEFAULT в строке запроса.Например,

string sqlQuery = "[dbo].[GetOrderData] @QueueId";

if (OrderIdList.Any())
{
    sqlQuery = sqlQuery + ", @OrderIdList";
}
else
{
    sqlQuery = sqlQuery + ", DEFAULT";
}

if (RegionIdList.Any())
{
    sqlQuery = sqlQuery + ", @RegionIdList";
}
else
{
    sqlQuery = sqlQuery + ", DEFAULT";
}

Слава http://www.sommarskog.se/arrays-in-sql-2008.html#Invoking, где я нашел решение для этого.

2 голосов
/ 21 июля 2017

Я был немного озадачен тем, что означает выражение «не передать параметр».В конечном итоге работа для Entity Framework ExecuteSqlCommandAsync () заключается в следующем:

  new SqlParameter("yourParameterName", SqlDbType.Structured)
  {
      Direction = ParameterDirection.Input,
      TypeName = "yourUdtType",
      Value = null
  };

Этот параметр будет передаваться как «по умолчанию».

0 голосов
/ 23 августа 2017

Я получаю сообщение об ошибке при пропуске пустого IEnumerable<int>, но он отлично работает, когда я пропускаю пустое List<int>.

...