#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.