Импортируйте набор данных с одним столбцом (CSV, TXT или XLXS) для работы в качестве списка в предложении SQL WHERE IN

#sql #sql-server

#sql #sql-server

Вопрос:

У меня есть набор данных, который я получаю еженедельно, этот набор данных представляет собой один столбец уникальных идентификаторов. В настоящее время этот набор данных собирается вручную нашим персоналом службы поддержки. Я пытаюсь запросить этот набор данных (CSV-файл) в моем WHERE предложении SQL-запроса.

Чтобы добавить этот набор данных в мой запрос, я выполняю некоторое преобразование данных для настройки форматирования, затем переформатированные данные вставляются непосредственно в WHERE IN часть моего запроса. В идеале у меня была бы возможность импортировать этот список в SQL-запрос напрямую, потенциально минуя ручные операции, связанные с форматированием данных и обменом между программами.

Мне просто интересно, возможно ли это, я изо всех сил пытался порыскать в Интернете, но мне не повезло найти какую-либо ссылку на эту функциональность.

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

1. возможно, вам потребуется запланировать еженедельное задание через агент SQL Server, использующий пакет SSIS, для загрузки файла за вас.

2. Хотя я не согласен с заданием агента SQL Server, поскольку существует так мало ETL и преобразований, которые должны произойти, я бы не рекомендовал SSIS. Это может быть достигнуто с использованием только TSQL, на который я предоставил ответ, показывающий.

Ответ №1:

Использование where in делает это более сложным, чем это должно быть. Сохраните идентификаторы, по которым вы хотите отфильтровать, в таблице с именем MyTableFilters со столбцом значений идентификаторов, которые вы хотите использовать в качестве фильтра (ов), и join от MyTable ID до MyTableFilters ID. Объединение приведет к тому, что MyTable будет возвращать строки, только если идентификатор в MyTable также включен MyTableFilters

select * from MyTable A join MyTableFilters F on A.ID = F.ID

Поскольку на самом деле вам не нужны какие-либо преобразования или манипуляции с данными, которые вы хотите использовать в ETL, вы также можете легко truncate использовать bulk insert для поддержания MyFiltersTable актуальности

truncate table dbo.MyFiltersTable

 BULK INSERT dbo.MyFiltersTable
FROM 'X:MyFilterTableIDSourceFile.csv'
WITH
(
  FIRSTROW = 1,
  DATAFILETYPE='widechar', -- UTF-16
  FIELDTERMINATOR = ',',
  ROWTERMINATOR = 'n',
  TABLOCK,
  KEEPNULLS -- Treat empty fields as NULLs.
)
  

Ответ №2:

Я предполагаю, что в настоящее время у вас есть что-то вроде следующего:

 SELECT *
FROM MyTable t
WHERE t.UniqueID in ('ID12','ID345','ID84')
  

Моей рекомендацией было бы создать таблицу, в которой будут храниться идентификаторы, указанные в WHERE предложении. Итак, для приведенного выше ваша таблица будет выглядеть следующим образом:

 UniqueID
========
ID12
ID345
ID84
  

Предположим, что таблица вызвана UniqueIDs , тогда исходный запрос становится:

 SELECT *
FROM MyTable t
WHERE t.UniqueID in (SELECT u.UniqueID FROM UniqueIDs u)
  

Тогда вы задаете вопрос о том, как заполнить таблицу UniqueIds. Вам нужны какие-то средства для предоставления этой таблицы вашим пользователям. Для этого есть несколько способов. Ленивым, но относительно эффективным решением была бы простая база данных MS Access с этой таблицей в качестве «связанной» таблицы. Возможно, вам придется быть осторожным с разрешениями.

В качестве альтернативы, предполагая, что вы привязаны к CSV, настройте задание SSIS, которое очищает таблицу, а затем импортирует из этого CSV в таблицу UniqueIds.