Вот один из возможных вариантов, который можно использовать для динамического создания листов Excel с использованием служб SSIS в зависимости от того, сколько записей вы хотите записать на лист Excel.Это не связано с задачами сценария.В следующем примере описывается, как этого можно достичь с помощью задач «Выполнение SQL», контейнера For Loop и задачи «Поток данных».Пример был создан с использованием SSIS 2008 R2
.
В базе данных SQL Server запустите сценарии, представленные в разделе SQL-сценарии раздел.Эти сценарии создадут таблицу с именем dbo.SQLData
, а затем заполнят таблицу данными умножения от 1 x 1
до 20 x 40
, создавая таким образом 800 записей.Сценарий также создает хранимую процедуру с именем dbo.FetchData
, которая будет использоваться в пакете служб SSIS.
В пакете служб SSIS создайте переменные 9 , как показано на снимке экрана# 1 .Следующие шаги описывают настройку каждой из этих переменных.
Установите переменную ExcelSheetMaxRows со значением 80 .Эта переменная представляет количество строк для записи на лист Excel.Вы можете установить его на значение по вашему выбору.В вашем случае это будет 65 535 (вы можете оставить одну строку для имен столбцов заголовков).
Установить переменную SQLFetchTotalRows со значением SELECT COUNT(Id) AS TotalRows FROM dbo.SQLData
.Эта переменная содержит запрос для извлечения общего количества строк из таблицы.
Выберите переменную StartIndex и выберите Свойства, нажав F4 .Установите для свойства EvaluateAsExpression значение True
, а для свойства Expression - значение (@[User::Loop] * @[User::ExcelSheetMaxRows]) + 1
.См. Скриншот # 2 .
Выберите переменную EndIndex и выберите Свойства, нажав F4 .Установите для свойства EvaluateAsExpression значение True
, а для свойства Expression - значение (@[User::Loop] + 1) * @[User::ExcelSheetMaxRows]
.См. Снимок экрана # 3 .
Выберите переменную ExcelSheetName и выберите Свойства, нажав F4 .Установите для свойства EvaluateAsExpression значение True
, а для свойства Expression - значение "Sheet" + (DT_WSTR,12) (@[User::Loop] + 1)
.См. Снимок экрана # 4 .
Выберите переменную SQLFetchData и выберите Свойства, нажав F4 .Установите для свойства EvaluateAsExpression значение True
, а для свойства Expression - значение "EXEC dbo.FetchData " + (DT_WSTR, 15) @[User::StartIndex] + "," + (DT_WSTR, 15) @[User::EndIndex]
.См. Снимок экрана # 5 .
Выберите переменную ExcelTable и выберите Свойства, нажав F4 .Задайте для свойства EvaluateAsExpression значение True
, а для свойства Выражение - значение, указанное в разделе Значение переменной ExcelTable .См. Снимок экрана # 6 .
На вкладке Поток управления пакета служб SSIS поместите задачу «Выполнение SQL» и настройте ее, как показано на снимках экрана # 7 и # 8 .Эта задача извлекает количество записей.
На вкладке «Поток управления» в пакете служб SSIS поместите контейнер For Loop и настройте его, как показано на скриншоте # 9 .Обратите внимание, что это для цикла , а не цикл по каждому элементу.Этот цикл будет выполняться на основе количества записей, отображаемых на каждом листе Excel, вместе с общим количеством записей, найденных в таблице.
Создание электронной таблицы Excel Excel 97-2003формат, содержащий расширение .xls, как показано на скриншоте # 10 .Я создал файл в ** C: \ temp **
В диспетчере соединений пакета служб SSIS создайте соединение OLE DB с именем SQLServer
, указывающее на SQL Server, и соединение Excel с именемExcel
указывает на вновь созданный файл Excel.
Нажмите на подключение Excel и выберите Свойства.Изменяет свойство DelayValidation с False на True, чтобы при переключении на использование переменной для создания листа в Задаче потока данных мы не получали никаких сообщений об ошибках.См. Снимок экрана # 11 .
Внутри контейнера For Loop поместите задачу «Выполнение SQL» и настройте ее, как показано на снимке экрана # 12 .Эта задача создаст таблицы Excel в соответствии с требованиями.
Внутри контейнера For Loop поместите задачу потока данных.После настройки задач вкладка «Поток управления» должна выглядеть так, как показано на снимке экрана # 13 .
Внутри задачи потока данных поместите источник OLE DB вчитать данные из SQL Server с помощью хранимой процедуры.Настройте источник OLE DB, как показано на снимках экрана # 14 и # 15 .
Внутри задачи потока данных поместите пункт назначения Excel ввставьте данные в листы Excel.Настройте пункт назначения Excel, как показано на снимках экрана # 16 и # 17 .
После настройки задачи потока данных она должна выглядеть следующим образомкак показано на скриншоте # 18 .
Удалите файл Excel, созданный на шаге 12 , поскольку пакет автоматически создаст файл приказнены.Если не удалить, пакет выдаст исключение, что Sheet1 уже существует.В этом примере используется путь C: \ temp \, а на снимке экрана # 19 показано, что по этому пути нет файлов.
Снимки экрана # 20 и # 21 показывают выполнение пакета в задачах Поток управления и Поток данных.
Снимок экрана # 22 * 1213 * показывает, что файл ExcelData.xls
былсозданный в пути C: \ temp.Помните, раньше этот путь был пуст.Поскольку в таблице было 800 строк, и мы установили переменную пакета ExcelSheetMaxRows , чтобы создать 80 строк на листе.Следовательно, файл Excel имеет 10 листов.См. Снимок экрана # 23 .
NOTE:
Одна вещь, которую я не сделал в этом примере, это проверить, является ли файл ExcelData.xls уже существует в пути C: \ temp.Если он существует, файл должен быть удален перед выполнением задач.Это может быть достигнуто путем создания переменной, содержащей путь к файлу Excel, и использования задачи «Файловая система» для удаления файла перед выполнением первой задачи «Выполнение SQL».
Надеюсь, это поможет.