Максимальное количество параметров в sql-запросе

Я экспериментирую с LINQ с некоторого времени. Типичный метод для перечисления в коллекции и изменения некоторых его свойств в моем коде будет выглядеть так:

ATDataContext dc = new ATDataContext(Settings.connection_string);

int[] col = ListViewClass.getListViewSelectedPositionTags(listView);

try
{
    foreach (var item in col)
    {
        var ctx = (from r in dc.MailingLists
                   where r.ID == item
                   select r).Single();

        ctx.Excluded = 'Y';
        ctx.ExcludedComments = reason;
    }

    dc.SubmitChanges();
}

Некоторое время у меня есть совет, чтобы сделать это... кажется гораздо более умным способом:

var ctx = from r in dc.MailingLists
    where col.Contains(r.ID)
    select r;

foreach (var item in ctx)
{
    item.Excluded = 'Y';
    item.ExcludedComments = reason;
}

dc.SubmitChanges();

Iit имеет смысл на стольких уровнях, и я люблю это решение. Его умный и быстрый, чем первый.

Я использовал это решение в рабочей среде в течение некоторого времени.

Каково было мое удивление спустя несколько недель при поиске файлов журналов приложений и увидеть следующее:

"Протокол потока входящих вызовов (RPC) входящего потока табличных данных (TDS) неверен. В этом запросе RCP было предоставлено слишком много параметров. Максимум 2100.

LINQ to SQL преобразует предложение where col.Contains(r.ID) в IN, выглядя примерно так:
  WHERE ID IN (@p1, @p1, @p2...)

Коллекция col достигла (в моем случае) более 2100 элементов и запрос не смог выполнить. Я провел некоторое исследование проблемы, и я закончил:

"... Максимальное количество параметров в sql-запросе - 2100. Есть больше ограничений, например, тот факт, что вся строка запроса не может быть длиннее 8044 символов."

Мне так понравилось второе решение. Я настолько разочарован этими жестко закодированными ограничениями SQL Server.

Я что-то пропустил? Есть ли что-нибудь, что я могу сделать, чтобы использовать версию "where col.Contains(r.ID)"?

Отношения Мариуш

пс. (Я использую Win XP, С# с LINQ и SQL 2005 Express).

Ответ 1

Ограничения жестко закодированы:

  • Параметры для хранимой процедуры 2,100
  • Параметры для пользовательской функции 2,100

Я написал код до того, как разбил запрос Contains на партии и объединил результаты... Подробнее см. здесь.