SQL ВЫБЕРИТЕ, ГДЕ значение В (‘Огромный список значений’)

#sql #linq #sql-server-2005

#sql #linq #sql-server-2005

Вопрос:

Примечание: Приложение C # 3.5 вызывает базу данных SQL Server 2005 на удаленном сервере.

Я разрабатываю двухэтапный процесс.

1) Я ищу в службе индексирования Windows список файлов, содержащих заданное слово, например «Bob».

2) Затем мне нужно получить список строк из таблицы DOCUMENT в базе данных SQL, передав список имен файлов из службы индексирования.

На данный момент я извлекаю список из службы индексирования И все строки из таблицы DOCUMENT, затем фильтрую их в коде. Это непрактично, поскольку имеется более 10 000 документов, а база данных подключена через брандмауэр.

Я рассматривал возможность создания запроса, такого как:

ВЫБЕРИТЕ DocName ИЗ Documents WHERE DocName IN ({список файлов из службы индексирования})

…но, учитывая, что список файлов может составлять тысячи, это не сработает.

Итак, что лучшее, что я могу сделать? Я не хочу запрашивать базу данных для всех 10000 строк и передавать их обратно через брандмауэр (занимает 10 минут). Мне как-то нужно передать список имен файлов, полученных из службы индексирования.

Как linq будет работать в этом сценарии?

Любой совет приветствуется.

Комментарии:

1. возможно, вы можете копировать файлы из службы индексирования в таблицу базы данных, например, каждую ночь? Тогда вы могли бы обойтись простым объединением двух таблиц. Я думаю, вам следует собрать все данные вместе, прежде чем вы сможете запросить их, теперь вы получаете все вместе на клиенте, что кажется громоздким.

2. краткий ответ: вставьте имена из службы индексирования во временную таблицу, соедините таблицу document и временную таблицу.

Ответ №1:

Если бы у вас был SQL Server 2008, вы могли бы использовать табличные параметры, но для 2005 года нет ничего более элегантного.

Самое простое решение, которое я могу придумать, это:

  • Создайте таблицу в базе данных
  • Массовая вставка результатов вашей службы индексирования в таблицу
  • Присоедините свой запрос к этой таблице, чтобы отфильтровать результаты
  • Извлеките загруженные результаты

Это не лучшее решение, но я не знаю, существует ли отличное решение — вот почему были созданы TVP.

Ответ №2:

Вы можете оценить различные решения для такого рода «масштабных» операций, возможно, нет необходимости использовать linq. Например, попробуйте реализовать хранимую процедуру на SQL Server, которая получает на входе список имен файлов и возвращает список документов.

Ответ №3:

Я выбрал решение, подобное тому, о котором упоминал Bazzz.

Я настроил ежевечернюю операцию по копированию требуемых полей из базы данных и установке мета-тегов в файлах документов (PDF-файлах). Затем метаданные могут быть использованы в службе индексирования; o)

Это оказалось хорошим решением для данного экземпляра, но в противном случае то, что сказал Халлайнзил, было бы лучшим вариантом, хотя и болезненным для Sql Server 2005.