SSIS со скриптом PowerShell для обновления соединений с Excel? - PullRequest
0 голосов
/ 04 января 2019

Я собираю пакет служб SSIS для записи записей данных служб Analysis Services в постоянные таблицы SQL для анализа пользовательских сеансов.

Вот процесс, который я пытаюсь создать:

Службы Analysis Services DMV [DISCOVER_SESSIONS] на сервере ' Server-A ' используется в качестве источника данных. На ' Сервер-B ' SSIS пакет [SSISDB/IsolatedPackages/SSASUsageStats.dtsx] пишет в Настраиваемая таблица БД [DBA].[dbo].[UsageStatsLogOLAP].

Источник извлекается и преобразуется с помощью Excel Powerquery, загружается в Excel и перенести в таблицу SQL Server из Excel. SSIS выполняет обновление Excel и передачу данных на SQL Server. После завершения пакета служб SSIS набор данных Excel загружен в SQL Server для добавления новых записей. Пример набора данных Excel показано ниже. (ПРИМЕЧАНИЕ: Excel Powerquery был выбран в качестве инструмента ETL для извлечения данных из-за его простота извлечения поля 'CubeCommand' [анализ подстроки], и поле 'ADUserNameDisplay' [поиск в Active Directory из «SESSION_USER_NAME»]) .

Это позволяет анализировать пользовательские сеансы OLAP в сверхурочное время. SSIS Пакет будет запускаться как задание агента SQL каждые 15 минут для добавления нового сеансы к пользовательской таблице SQL Server.

Требуется помощь:

Есть ли в SSIS средства для выполнения сценария PowerShell для SSIS для обновления соединений Excel? Кроме того, имея в виду, что полномочия к экземпляру служб Analysis Services, необходимому для проверки подлинности пакета? Является Есть лучший способ обновить Excel (вместо PowerShell в SSIS)?

Некоторые параметры обновления, которые я рассмотрел ...

 SSIS PowerShell script
 SSIS VB script
 SSIS C# script
 3-party SSIS software (CozyRoc, PowerPack, TaskFactory)  

Согласно веб-сайту фабрики задач, версия Pro (2495 долл. США на сервер) включает компонент «Задача обновления питания Excel». У кого-нибудь есть опыт работы с этим дополнением? Я не пытался загрузить это расширение.

Пожалуйста, смотрите ниже сценарии PoSH, используемые до сих пор. Пакет функционален, но еще не автоматизирован. Мне нужна помощь относительно автоматизации обновления Excel, чтобы завершить пакет. Мы ценим идеи ... Спасибо!


Метод: команда сценария Power Shell:

Проблема с этой командой в том, что она открывает второе окно оболочки питания. Если я запускаю это в двух отдельных сценариях, книга Excel успешно обновляется. Если я запускаю его как один сценарий, он использует мои учетные данные пользователя (вместо предоставленных учетных данных пользователя) - файл Excel успешно сохраняется, но обновление данных не удается.

##### STEP 1 ######
# Run powershell as another user account (DOMAIN\?????), for accessing the GCOP039 OLAP DMV 
cd C:
# REM: Define domain username and password 
$username = 'DOMAIN\bl0040ep'
$password = '!mySecretPwd'
# REM: Convert to a single set of credentials
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword
# REM: Launch PowerShell (runas) as another user
Start-Process powershell.exe -Credential $credential #-WindowStyle Maximized


##### STEP 2 ######
# Refresh the excel workbook connections and save the updated file
$file = 'C:\SVN\BusinessAnalysts\ExcelTools\DatabaseSSAS_Usage Stats.xlsx'
$x1 = New-Object -ComObject Excel.Application
$x1.Visible = $false
$x1.DisplayAlerts = $False
$enddate = (Get-Date).tostring("dd-MM-yy")
$filename = 'C:\SVN\BusinessAnalysts\ExcelTools\DatabaseSSAS_Usage Stats ' + $enddate + '.xlsx'
$wb = $x1.workbooks.Open($file)
$wb.refreshall()
# REM: Use SLEEP to eliminate the message: "This will cancel a pending data refresh. Continue?"
Start-Sleep -Second 20
$wb.SaveAs($filename)
$wb.Close()
$x1.Quit()
Remove-Variable wb,x1

Рекомендации:


Метод: пользовательские расширения служб SSIS (CozyRoc, PowerPack, TaskFactory):

CozyRoc

Во время разработки мы пытались использовать настраиваемое расширение SSIS («Excel Source Plus» от CozyRoc), чтобы использовать параметр «Пересчет» для обновления книги Excel. Это не сработало, как было объявлено, и когда я связался со службой поддержки CozyRoc, они также подтвердили: «Мы не поддерживаем обновление внешних подключений к данным».

Фабрика задач

Согласно веб-сайту фабрики задач, версия Pro (2495 долл. США на сервер) включает компонент «Задача обновления Power Excel». У кого-нибудь есть опыт работы с этим дополнением? Я не пытался загрузить это расширение.

Рекомендации:


Скриншоты

пс-script_excel-обновления-2-windows.png

ps-script_excel-refresh-2-windows.png

SSISDB-IsolatedPackages-SSASUsageStats.dtsx.png

SSISDB-IsolatedPackages-SSASUsageStats.dtsx.png

exceldataset-DBA.dbo.UsageStatsLogOLAP.png

exceldataset-DBA.dbo.UsageStatsLogOLAP.png

1 Ответ

0 голосов
/ 26 марта 2019

Это звучит как болезненный процесс. Если бы это был я, я бы пропустил биты Excel + Powerquery в пакете служб SSIS. Просто загрузите данные из представлений DMV (с отметкой времени) непосредственно в таблицы. Предпочтительно временные таблицы SQL Server 2016.

Затем создайте электронную таблицу Excel вне процесса SSIS для конечных пользователей, которая извлекает данные из запросов временной таблицы. Из-за характера запросов к временной таблице сегмент / окно по умолчанию для них всегда будет «самым последним» (однако это определено для временной таблицы ...).

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

Если вы можете использовать SQL Server 2016+, изучите временные таблицы и запросы. Похоже, они облегчили бы то, что вы пытаетесь сделать здесь.

В книге Excel (.xlsm) вы можете обновить данные PowerQuery при открытии книги, что всегда должно быть «самыми последними» данными.

Excel, как правило, не очень хороший инструмент для автоматического анализа данных. Это прежде всего инструмент конечной точки пользователя.

Существует множество скриптов Powershell для «запуска» Excel (через COM-взаимодействие), если вам нужно сделать это таким образом. Это оставляет процесс Powershell, вызываемый из SSIS, ответственным за разрушение COM-объектов после завершения процесса Powershell.

Автоматизация Excel через COM Interop на сервере сопряжена с риском того, что Excel не выйдет полностью, что приведет к тому, что многие процессы Excel-зомби будут поглощать ресурсы. Так что остается настроить другой процесс, который периодически убивает процессы зомби в Excel ... (и в сетях есть примеры того, как это сделать тоже), если вы не можете полностью очистить [sic] после Excel.

Если вам нужно создавать файлы Excel из серверного процесса (каким будет SSIS ...), в прошлом я имел успех, используя EPPlus .Net DLL со скриптами Powershell в SSIS. Powershell получает данные, а затем вызывает EPPlus для записи данных непосредственно в файлы Excel (.xlsx) без необходимости или взаимодействия с Excel.exe. (чтение тоже работает).

Библиотека "NPOI.dll" является портом .Net библиотеки Java "POI", которая также может выполнять запись в файлы "Excel.Old" (.xls), а также в файлы .xlsx. Работает аналогично EPPlus.

Большим преимуществом любого из них (который, я подозреваю, вы заметили, что Powerquery также не работает с данными ...) является то, что вы можете обойти "справку", которую Excel будет применять к данным, загружаемым в рабочую книгу. , (например, с помощью EPPlus вы можете вставлять почтовые индексы или американские SSN в ячейки в виде текстовых значений - вы управляете стилями ячеек и форматом отображения. Excel «поможет» вам, преобразовав их в числовые данные, потеряв при этом все начальные 0. ... попытка преодолеть эту антипомощь включает в себя любое количество разных кладджей).

...