【问题标题】:SSIS with PowerShell script to refresh Excel connections?使用 PowerShell 脚本刷新 Excel 连接的 SSIS?
【发布时间】:2019-05-31 03:35:48
【问题描述】:

我正在构建一个 SSIS 包,以将 Analysis Services DMV 数据记录捕获到持久的 SQL 表中,以分析用户会话。

这是我正在尝试创建的过程:

服务器上的 Analysis Services DMV [DISCOVER_SESSIONS] 'Server-A' 用作数据源。在“Server-B”上的 SSIS 包[SSISDB/IsolatedPackages/SSASUsageStats.dtsx] 写入 自定义数据库表[DBA].[dbo].[UsageStatsLogOLAP]

使用 Excel Powerquery 提取和转换源,加载 到 Excel,并从 Excel 传输到 SQL Server 表。 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 中是否有一种方法可以为 SSIS 执行 PowerShell 脚本以刷新 Excel 连接?另外,请记住凭据 需要对包进行身份验证的 Analysis Services 实例?是 有更好的方法来刷新 Excel(而不是 PowerShell SSIS)?

我研究过的一些刷新选项...

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

根据 Task Factory 网站,专业版(每台服务器 2,495 美元)包含一个组件“Excel Power Refresh Task”。有没有人有这个插件的经验?我没有尝试下载这个扩展。

请参阅下文了解目前使用的 PoSH 脚本。该软件包是功能性的,但尚未自动化。我需要有关自动刷新 Excel 以完成包的帮助。感谢您的见解...谢谢!


方法:Power Shell 脚本命令:

这个命令的问题是它打开了第二个 power shell 窗口。如果我在 2 个单独的脚本中运行它,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 扩展(来自 CozyRoc 的“Excel Source Plus”任务)来利用“重新计算”设置来刷新 Excel 工作簿。这并没有像宣传的那样起作用,当我联系 CozyRoc 支持人员时,他们也进行了验证,并指出:“我们不支持刷新外部数据连接”。

任务工厂

根据 Task Factory 网站,专业版(每台服务器 2,495 美元)包含一个组件“Excel Power Refresh Task”。有没有人有这个插件的经验?我还没有尝试下载此扩展程序。

参考文献:


截图

ps-script_excel-refresh-2-windows.png

SSISDB-IsolatedPackages-SSASUsageStats.dtsx.png

exceldataset-DBA.dbo.UsageStatsLogOLAP.png

【问题讨论】:

  • 我想在此要求中添加更多信息。我在代码 plex SSIS Excel Refresh Task 上找到了一个开源自定义 SSIS 任务。我下载了文件,但我不确定如何安装自定义任务。有人知道吗?下载附带了很多文件,包括“sourceCode”文件夹和“Microsoft Excel Refresh Task.sln”Visual Studio 解决方案文件。我从The Data Queen 网站找到了说明,但我想我需要更多信息。

标签: sql-server excel powershell ssis permissions


【解决方案1】:

这听起来像是一个痛苦的过程。如果是我,我会跳过 SSIS 包中的 Excel + Powerquery 位。只需将 DMV 视图中的数据(带有时间戳)直接加载到表中即可。最好是 SQL Server 2016 时态表。

然后,在 SSIS 流程之外为最终用户设置一个 Excel 电子表格,从临时表查询中提取数据。由于时态表查询的性质,它们上的默认段/窗口将始终是“最新的”(但是它是为时态表定义的......)。

然后,您可以参数化发送回时间查询的时间段以捕获不同的窗口 - 设置“量子”的 Excel 列表以发送到时间查询,用户从列表中选择一个值,然后触发该“量子”的数据刷新。

如果您可以使用 SQL Server 2016+,请对临时表和查询进行一些研究。听起来他们会促进您在这里尝试做的事情。

在 Excel 工作簿 (.xlsm) 中,您可以让它在打开工作簿时刷新 PowerQuery 数据,这应该始终使其成为“最新”数据。

Excel 通常不是用于自动数据分析过程的非常好的工具。它主要是一个用户端点工具。

如果您需要这样做,有很多 Powershell 脚本可以“驱动”Excel(通过 COM 互操作)。这使得从 SSIS 调用的 Powershell 进程负责在 Powershell 进程结束时拆除 COM 对象。

通过服务器上的 COM 互操作使 Excel 自动化存在无法完全退出 Excel 的风险,这将导致大量 Excel 僵尸进程占用资源。因此,如果您在 Excel 之后无法完全清理 [原文如此],则需要设置另一个进程来定期杀死 Excel 僵尸进程......(网上也有关于如何执行此操作的示例)。

如果您必须从服务器进程(SSIS 将是...)创建 Excel 文件,我过去在 SSIS 中使用带有 Powershell 脚本的 EPPlus .Net DLL 取得了成功。 Powershell 获取数据,然后调用 EPPlus 将数据直接写入 Excel 文件 (.xlsx),无需 Excel.exe 或与 Excel.exe 交互。 (阅读作品,也是)。

“NPOI.dll”库是 Java“POI”库的 .Net 端口,它还可以写入“Excel.Old”(.xls) 文件以及 .xlsx 文件。它的工作原理与 EPPlus 类似。

其中任何一个的最大优势(我怀疑您注意到 Powerquery 也不会对数据执行...)是您可以回避 Excel 将应用于加载到工作簿中的数据的“帮助” . (例如,使用 EPPlus,您可以将邮政编码或美国 SSN 作为文本值推送到单元格中 - 您可以控制单元格样式和显示格式。Excel 将通过将这些转换为数字数据来“帮助”您,从而丢失任何前导 0。 . 试图克服这种反帮助涉及许多不同的问题)。

【讨论】:

  • 感谢您提供的所有信息。我最终将 SSIS 包数据源从 Excel 更改为 OLE DB Provider for Analysis Services 12.0。然后,我将数据加载到 SQL Server 中,并使用其他 SQL 对象(stored procview)将数据进一步处理为我在 Excel PQ 中实现的(但不是自动化的)格式。所吸取的教训与您所说的完全一样...Excel 通常不是用于自动数据分析过程的好工具。
猜你喜欢
  • 1970-01-01
  • 2012-04-05
  • 1970-01-01
  • 2015-10-30
  • 1970-01-01
  • 2017-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多