Фильтр переменных SSIS для другой таблицы в несвязанной базе данных

#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