Как разбить данные таблицы на отдельные именованные файлы Excel с помощью пакета служб SSIS? - PullRequest
2 голосов
/ 06 февраля 2009

Я работаю с набором данных из SQL Server, которые я хотел бы добавить в группу файлов Excel. Эта задача должна быть автоматизирована для запуска на ежемесячной основе. Данные выглядят как

Site    ID      FirstName   LastName
------  ------- ---------   ---------
North   111     Jim         Smith
North   112     Tim         Johnson
North   113     Sachin      Tedulkar
South   201     Horatio     Alger
South   205     Jimi        Hendrix
South   215     Bugs        Bunny

Я бы хотел, чтобы результаты выглядели как

In Excel file named North.xls

ID      FirstName   LastName
111     Jim         Smith
112     Tim         Johnson
113     Sachin      Tedulkar

In Excel file named South.xls

ID      FirstName   LastName
201     Horatio     Alger
205     Jimi        Hendrix
215     Bugs        Bunny

В столбце «Сайт» есть от 70 до 100 значений, на которые я бы хотел разделить. Я использую SSIS для выполнения этой задачи, но застреваю после того, как извлек данные из SQL Server с помощью задачи OLE DB Source. Что должно быть дальше? Если есть более простой способ сделать это с помощью других инструментов, я тоже открыт для этого.

Ответы [ 4 ]

12 голосов
/ 16 июля 2011

Возможно, вы уже нашли ответ на свой вопрос. Это для других пользователей, которые могут наткнуться на этот вопрос. Следующий пример показывает, как это может быть достигнуто динамически для любого количества Сайтов, которые могут присутствовать. Пример был создан с использованием SSIS 2008 R2 с SQL Server 2008 R2 базой данных.

Пошаговый процесс:

  1. Выполните сценарии, приведенные в разделе «Сценарии SQL» в базе данных SQL Server, чтобы создать таблицу с именем dbo.Source и заполнить данными (аналогично данным, приведенным в вопросе). Он также создает хранимую процедуру с именем dbo.GetSiteData.

  2. В соединении пакета служб SSIS создайте соединение OLE DB для соединения с SQL Server. Мы подключимся к Excel позже на этих шагах.

  3. В пакете служб SSIS создайте 6 переменных, как показано на скриншоте # 1 . Заполните переменную Site значением Template, это примерное значение, которое будет использоваться для оценки других выражений. Установите переменную SQLUniqueSites со значением SELECT DISTINCT Site FROM dbo.SourceData. Установите переменную ExcelFolder со значением C:\temp\

  4. Выберите переменную ExcelFilePath и нажмите F4, чтобы просмотреть свойства. Измените свойство EvaluateAsExpression на True и установите свойство Выражение со значением @[User::ExcelFolder] + @[User::Site] + ".xls". Смотрите скриншот # 2 .

  5. Выберите переменную ExcelSheet и нажмите F4 для просмотра свойств. Измените свойство EvaluateAsExpression на True и установите свойство Выражение со значением, указанным в Значение переменной ExcelSheet . Смотрите скриншот # 3 .

  6. На вкладке Поток управления пакета служб SSIS поместите Execute SQL Task и настройте его, как показано на скриншотах # 4 и # 5 . Эта задача будет получать уникальные имена сайтов.

  7. На вкладке Поток управления пакета служб SSIS поместите Foreach Loop container после задачи «Выполнение SQL» и настройте контейнер «цикл по каждому элементу», как показано на снимках экрана # 6 и # 7 Этот цикл перебирает набор результатов и считывает каждый сайт в переменную. Затем эта переменная используется для предоставления имени файла Excel, а также параметра хранимой процедуры в задаче потока данных, которая будет добавлена ​​в ближайшее время.

  8. Внутри контейнера цикла по каждому элементу поместите Execute SQL Task, а затем поместите Data Flow Task. На этом этапе вкладка «Поток управления» должна выглядеть так, как показано на скриншоте # 8 . Ваш пакет может показывать ошибки на этом этапе, мы исправим это в ближайшее время на следующих шагах. Мы настроим задачу потока данных и вернемся к задаче «Выполнение SQL» в контейнере цикла по каждому элементу.

  9. Внутри задачи потока данных поместите OLE DB Source и настройте его, как показано на скриншотах # 9 и # 11 . Это позволит получить данные из таблицы на основе данного сайта. Нажмите кнопку Параметры ... , чтобы установить параметры запроса.

  10. Если типы данных поля таблицы имеют формат VARCHAR, то нам необходимо преобразовать его в NVARCHAR (формат Unicode), в противном случае этот шаг не требуется. В задаче «Поток данных» поместите преобразование Data Conversion после источника OLE DB и настройте его, как показано на снимке экрана # 12 .

  11. Далее, внутри Задачи потока данных, поместите пункт назначения Excel, нажмите первую кнопку New ..., как показано на скриншоте # 13 .

  12. В диалоговом окне «Диспетчер соединений Excel» укажите путь к файлу Excel и нажмите «ОК». Смотрите скриншот # 14 . Вернувшись в пункт назначения Excel, нажмите вторую кнопку New ..., как показано на скриншоте # 15 . В диалоговом окне «Создать таблицу» убедитесь, что сценарий показан на снимке экрана # 16 , и нажмите кнопку «ОК». При отображении с предупреждением, как показано на скриншоте # 17 , нажмите OK. Выберите значение Template в раскрывающемся списке Имя листа Excel , как показано на снимке экрана # 18 . Настройте столбцы, как показано на скриншоте # 19 .

  13. В диспетчере соединений пакета служб SSIS выберите вновь созданный диспетчер соединений Excel и нажмите F4, чтобы просмотреть свойства. Измените значение свойства Name на Excel. Измените DelayValidation на True, чтобы, если файл Template.xls не существовал, вы не получали сообщение об ошибке. Установите выражение ServerName со значением @[USer::ExcelFilePath]. Смотрите скриншот # 20 . NOTE: Файл Excel должен быть создан по пути C: \ temp \ Template.xls. Возможно, вы захотите сохранить его, чтобы не встретить во время будущих изменений дизайна. Вы все еще можете восстановить его, если файл удален.

  14. Вернитесь в пункт назначения Excel и настройте его, как показано на скриншоте # 21 . После настройки задачи потока данных она должна выглядеть, как показано на скриншоте # 22 * ​​1157 *.

  15. Вернувшись на вкладку «Поток управления», настройте задачу «Выполнение SQL» в контейнере «цикл по каждому элементу», как показано на снимке экрана # 23 . Эта задача создаст новые таблицы Excel для каждого имени сайта.

  16. Снимок экрана # 24 показывает содержимое в папке c: \ temp \ до выполнения пакета.

  17. Снимки экрана # 25 и # 26 показывают выполнение пакета.

  18. Снимок экрана # 27 показывает содержимое в папке c: \ temp \ после выполнения пакета.

  19. Снимки экрана # 28 и # 29 показывают содержимое вновь созданных электронных таблиц Excel North.xls и South.xls. Оба листа содержат данные о сайтах с одинаковыми именами.

Надеюсь, это поможет.

Значение переменной ExcelSheet:

CREATE TABLE `Template` (`Id` Long, `FirstName` LongText, `LastName` LongText)

Сценарии SQL:

CREATE TABLE [dbo].[SourceData](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Site] [varchar](50) NOT NULL,
    [FirstName] [varchar](40) NOT NULL,
    [LastName] [varchar](40) NOT NULL,
CONSTRAINT [PK_SourceData] PRIMARY KEY CLUSTERED ([Id] ASC)
) ON [PRIMARY]
GO

INSERT INTO dbo.SourceData (Site, FirstName, LastName) VALUES
    ('North', 'Jim', 'Smith'),
    ('North', 'Tim', 'Johnson'),
    ('North', 'Sachin', 'Tendulkar'),
    ('South', 'Horatio', 'Alger'),
    ('South', 'Jimi', 'Hendrix'),
    ('South', 'Bugs', 'Bunny');
GO

CREATE PROCEDURE dbo.GetSiteData
(
    @Site   VARCHAR(50)
)
AS
BEGIN   
    SET NOCOUNT ON;

    SELECT  Id 
        ,   FirstName
        ,   LastName
    FROM    dbo.SourceData
    WHERE   Site = @Site
END 
GO

Скриншот № 1:

1

Снимок экрана № 2:

2

Скриншот № 3:

3

Снимок экрана № 4:

4

Снимок экрана № 5:

5

Снимок экрана № 6:

6

Снимок экрана № 7:

7

Снимок экрана № 8:

8

Снимок экрана № 9:

9

Снимок экрана № 10:

10

Снимок экрана № 11:

11

Снимок экрана № 12:

12

Снимок экрана № 13:

13

Снимок экрана № 14:

14

Скриншот № 15:

15

Снимок экрана № 16:

16

Скриншот № 17:

17

Снимок экрана № 18:

18

Снимок экрана № 19:

19

Снимок экрана № 20:

20

Снимок экрана № 21:

21

Снимок экрана № 22:

22

Снимок экрана № 23:

23

Снимок экрана № 24:

24

Снимок экрана № 25:

25

Снимок экрана № 26:

26

Снимок экрана № 27:

27

Снимок экрана № 28:

28

Снимок экрана № 29:

29

1 голос
/ 12 октября 2015

Я нашел решение проблемы с адресатом Excel. Я переустановил Microsoft Access Engine Redistributable (32-разрядная версия). Все работает хорошо. У меня были проблемы с 64-битной и 32-битной системами, поскольку они несовместимы, поскольку моя система была 64-битной.

1 голос
/ 06 февраля 2009

Не уверен, что это сработает, но поместите все ваши запросы условий в таблицу вместе с другим полем для имени файла. Затем используйте цикл for для прохождения каждого из них и динамически измените предложение select задачи transform. SSIS вызывает эти динамические изменения - выражения.

Вы делаете выбор в своей таблице утверждений / условий и затем выбрасываете это в переменную объекта. Затем переменная объекта используется в цикле for.

Единственное, в чем я не уверен, так это в сопоставлении имени файла Excel.

edit: также нашел это, который использует связанный сервер http://codebetter.com/blogs/raymond.lewallen/archive/2005/05/04/62781.aspx

1 голос
/ 06 февраля 2009

Я думаю, что SSIS - хороший инструмент для использования, и у вас есть несколько вариантов.

По сути, вы можете использовать многоадресные и условные объекты разделения для достижения желаемого.

Вот как бы я это сделал:

1) Я бы создал два файла MS Excel со всеми данными в том виде, в каком я хотел бы его видеть. Удалите данные и сохраните их как файлы шаблонов и сделайте копию для полных файлов.

2) Настройте соединения файлов с этими файлами в диспетчере соединений.

3) Создайте задачу файловой системы, которая перезапишет полные файлы с шаблоном в начале работы (другие способы сделать это, но мне нравится этот лучше).

4) Добавьте задачу потока данных и добавьте в нее источник OLE DB, многоадресную рассылку, два условных разбиения и два получателя MS Excel.

5) Настройте каждый из них, и все готово. Конфигурация довольно интуитивно понятна и в порядке, указанном выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...