SSIS Использование Loop Container через идентификаторы отчетов для создания отдельных файлов CSV - PullRequest
0 голосов
/ 02 декабря 2011

Позвольте мне предварить это словами, что я все еще новичок, когда дело доходит до SSIS.Я пытаюсь заменить текущий процесс MS Access, который имеет 13 запросов, которые создаются в Excel и отправляются по электронной почте в список пользователей.

Мой пакет служб SSIS должен получить имя отчета, список рассылки электронной почты, данные отчета, создать файл csv, а затем отправить электронное письмо для каждого из них.

Я создал следующее в SQL Server:

  1. таблица с отчетами - у каждого есть ReportId
  2. таблица с адресами электронной почты пользователей
  3. таблица соединений, которая связывает пользователя с каждым отчетом
  4. Создает сохраненный процесс, когда я передаю ReportId, и он возвращает список рассылки электронной почты, а также некоторые подробности отчета для использования при отправке моих писем
  5. Создает сохраненный процесс, который я передаю ReportIdк.В ответ я получу любое из значений для этого отчета.Каждый отчет имеет свой запрос, который возвращает разные столбцы данных.

Я также пытался создать пакет служб SSIS, который выполняет следующие действия:

  1. с использованием Execute SQL Taskполучите список активных идентификаторов отчетов
  2. a Foreach Container Loop, установленный на ADO Enumerator для циклического просмотра каждого идентификатора отчета
  3. и Execute SQL Task, который будет возвращать мои данные отчета и список рассылки электронной почты для каждогоидентификатор отчета.

Затем я попытался поместить Data Flow Task внутри цикла и запустить свой сохраненный процесс, чтобы вернуть данные отчета для каждого идентификатора отчета, но я получаю сообщение об ошибке:

Error: SSIS Error Code DTS_E_OLEDBERROR.  An OLE DB error has occurred. 
Error code: 0x80040E55. An OLE DB record is available.  
Source: "Microsoft SQL Server Native Client 10.0"  Hresult: 0x80040E55  Description: "Column does not exist.". 

Я предполагаю, что это ошибка, потому что мои столбцы не совпадают в каждом отчете.Если это так, то есть ли у вас какие-либо предложения о том, как действовать?

Какие шаги я должен использовать в своем пакете служб SSIS для просмотра каждого отчета?Нужно ли создавать отдельный пакет служб SSIS для запуска каждого отчета?

Если я могу запустить это в одном пакете, нужно ли мне создавать диспетчер соединений с плоскими файлами для каждого из моих отчетов csv, которые я генерирую?

Ответы [ 3 ]

1 голос
/ 03 декабря 2011

Я думаю, что ваш подход обоснован, вам просто нужно сделать что-то другое на шаге 3. Я думаю, что sp_send_dbmail может быть вариантом (вызовите его через задачу «Выполнение SQL»).

Вы можете назначить свой запрос # 6 параметру @query (@query = "EXECUTE dbo.MakeReport @ reportid = 10 ') и @ attach_query_result_as_file = 1, и, если вы включили почту базы данных, он отправит по электронной почте получателям с результатами вашего запроса в виде CSV.

Используйте выражения, чтобы установить to, cc и bcc на основе результатов вашего первого запроса и вуаля, spam-o-matic.

0 голосов
/ 02 декабря 2011

К сожалению, SSIS требует, чтобы метаданные конвейера потока данных были установлены во время разработки, поэтому, если вы собираетесь использовать задачу потока данных, вам потребуется отдельная задача для каждого отчета.

Вы можете обойтись без отдельной задачи потока данных и диспетчера файловых соединений для каждого отчета, не используя поток данных. Вместо этого вы можете использовать BCP (программу массового копирования) для копирования данных в файл без необходимости предварительно определять метаданные. BCP возьмет ваш набор результатов хранимых процедур и просто выгрузит их в файл. У Дастина Райана есть отличная статья о том, как это сделать в BIDN. В некоторых случаях использование BCP в SSIS может быть лучшим выбором по сравнению с задачей потока данных, если преобразования не нужны, и это одна из них. тех времен.

0 голосов
/ 02 декабря 2011

Если в ваших отчетах разные столбцы, для каждого из них вам понадобится отдельный поток данных. Если вы по-прежнему хотите выполнять их в одном и том же цикле Foreach, вы можете попробовать сделать что-то вроде переменной типа reportType, которая заполняется при запуске Execute SQL Task. После этого вы можете направить поток туда к правильному потоку данных. На следующем рисунке показан пример условного потока: Conditional Data Flow

В этом руководстве, хотя и с другой целью, автор описывает, как создать условный поток: http://www.simple -talk.com / sql / ssis / xml-configuration-files-in-sql-server- интеграции услуг /

Здесь вы найдете больше информации о переменных: http://sqlfool.com/2009/08/getting-started-with-variables-in-ssis/

...