Я изо всех сил пытаюсь найти ответы в Интернете на этот вопрос, так что извините за недостаток исследований, я перешел прямо к вопросу под рукой.
Я создаю следующий запрос в C # с помощью dapper;
SELECT BookName
FROM dbo.Books
WHERE {predicates}
В настоящее время у меня есть частная функция, которая берет список значений ключа из столбца и значения и преобразует его в наборгде пункты.Например;
var searchTerms = new List<KeyValuePair<string, string>>{
new KeyValuePair("ReferenceId", "42"),
new KeyValuePair("AuthorId", "1")
};
Это будет преобразовано в;
SELECT BookName
FROM dbo.Books
WHERE ReferenceId = 41
AND AuthorId = 1
Так что это работает, и все в порядке.
Проблема под рукой
Пользователь может и ввел в пользовательский интерфейс 10 000 идентификаторов.Пользовательский интерфейс и сервер не имеют проблем с обработкой этого, но SQL-сервер меня не устраивает, я получаю следующее:
Входящий запрос имеет слишком много параметров.Сервер поддерживает максимум 2100 параметров.Уменьшите количество параметров и повторно отправьте запрос
Теперь я знал, что это ограничение существует, и я также знаю, что ограничение существует при использовании оператора IN
.Вопрос в том, как мне обойти это?
Моей первой мыслью было передать json и изменить запрос на что-то вроде этого;
SELECT BookName
FROM dbo.Books
WHERE ReferenceId IN (
SELECT UpcId FROM OPENJSON(@json) WITH(UpcId bigint '$')
)
КакНасколько я могу судить, это решение будет работать, но с учетом моего исходного сценария, что если пользователь вставит 10 000 идентификаторов авторов.
Я ожидаю, что по крайней мере один ответ будет "Просто ваш запрос", и яХотелось бы, чтобы это было возможно.Мы говорим о 13-миллионной таблице строк с 20+ столбцами, большинство из которых важны для кого-то.
Элегантное решение, которое я хотел бы ...
В идеале, и я не уверенесли это возможно ...
Я бы очень хотел передать данные как json и заполнить следующую объявленную таблицу:
DECLARE @booksToFind TABLE (Column nvarchar(max), Value nvarchar(max))
Теперь я знаю, как заполнить эту таблицу, ноЯ абсолютно не представляю, можно ли создать запрос для использования этих значений в качестве столбцов и создать эквивалентное предложение where в элегантном запросе!