#sql #sql-server #tsql #ssis #etl
#sql #sql-сервер #tsql #ssis #etl
Вопрос:
Я загружаю набор данных из Excel на наш локальный сервер, который мы используем для выполнения автономных запросов, и хочу использовать информацию в этой таблице для фильтрации в таблице, которая находится в нашей производственной системе, чтобы затем я мог перенести отфильтрованную таблицу в нашу локальную базу данных, а не извлекать всю таблицу из prod на наш локальный. Я рассматривал возможность создания переменной, которая содержала бы все номера учетных записей в строке, а затем использовала бы это в инструкции IN (?). Это сработало, но он выбрал только первую учетную запись в строке, а не остальные.
Я не могу создать временную таблицу в prod или что-либо еще, поскольку она заблокирована только для администратора базы данных. Я пробовал некоторые вещи в SSIS, такие как создание переменных и т.д., Но это не сработало. Я пытаюсь избежать сброса всей таблицы. Если мне нужно будет это сделать, я настрою его на обновление из действительного поля from для захвата новых записей.
SELECT
*
FROM account_table
where [account number] in (?)
Я создал ? переменная в отдельном окне SQL для выполнения задачи, где? является
select
string_agg([account number], ', ')
from [distinct account_table].
Я также пытался:
select
string_agg([account number], ',')
from [distinct account_table]
но это не сработало.
Комментарии:
1. Можете ли вы показать нам пример того, как выглядит объединенная строка?
2. Вы должны использовать
select '''' string_agg([account number], ',') '''' from [distinct account_table]
или вы должны использовать выражения, упомянутые в ответе ниже
Ответ №1:
Вы можете использовать выражения вместо передачи параметров.
Откройте Execute SQL Task
редактор, перейдите на Expressions
вкладку, добавьте новое выражение для SqlStatementSource
свойства следующим образом:
"SELECT
*
FROM account_table
where [account number] in ('"
@[User::Variable] "')"
С другой стороны, если я столкнусь с подобной ситуацией, я буду использовать преобразование поиска для этого вместо инструкций SQL.
Комментарии:
1. Спасибо за это. Я попробую это завтра. Я новичок в SSIS и никогда не использовал выражение. Я буду держать вас в курсе. Спасибо
Ответ №2:
Прежде всего, связанные серверы здесь не нужны, это просто мост, соединяющий два сервера.
Возможно, я упускаю что-то очевидное здесь.. Вы говорите, что загрузили набор данных в свою локальную базу данных и теперь хотите получить данные из prod, который содержит эти учетные записи.
Я предлагаю создать поток данных и использовать источник oledb для получения данных из prod. Затем добавьте поиск, который присоединяется к вашему набору данных в вашей локальной базе данных (присоединяйтесь к учетной записи, убедитесь, что вы подключаетесь к вашей локальной базе данных и что вы перенаправляете не совпадающие строки на не совпадающий вывод). Затем добавьте назначение oledb для загрузки данных в вашу локальную базу данных.
Комментарии:
1. Я тоже пробовал это. по какой-то причине это привело бы только к первому наблюдению за номером учетной записи. Существует отношение «Один ко многим». Кроме того, функция поиска кажется действительно неэффективной, поскольку она заняла намного больше времени, чем WHERE account_number в (……….)
2. Можете ли вы добавить некоторые образцы данных из набора данных Excel к вашему вопросу. Я предполагаю, что это не конкатенация (т. Е. сохраненная строка за строкой)?
3. Да, это строка за строкой. Затем я беру разные account_numbers и затем сохраняю в виде строки, используя string_agg