我正在构建一个SSIS包,以将Analysis Services DMV数据记录捕获到用于分析用户会话的持久SQL表中。
这是我要创建的过程:
服务器上的Analysis Services DMV
[DISCOVER_SESSIONS]
“ 服务器-A ”用作数据源。在“ 服务器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 包将每15分钟作为SQL Agent作业运行一次以添加新 自定义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)
根据Task Factory网站,Pro版本(每服务器$ 2,495)包括一个组件“ Excel Power Refresh Task”。有人对这个插件有经验吗?我没有尝试下载此扩展程序。
请参阅以下有关到目前为止使用的PoSH脚本的信息。该软件包可以运行,但尚未实现自动化。我需要有关Excel刷新自动化的帮助,以完成软件包。感谢您的见解...谢谢!
此命令的问题是它将打开第二个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
参考文献:
CozyRoc
在开发过程中,我们尝试使用自定义的SSIS扩展(来自CozyRoc的“ Excel Source Plus”任务)来利用“重新计算”设置来刷新Excel工作簿。这样做并不像宣传的那样,当我联系CozyRoc支持人员时,他们也进行了验证,并指出:“我们不支持刷新外部数据连接”。
任务工厂
根据Task Factory网站,Pro版本(每服务器$ 2,495)包括一个组件“ Excel Power Refresh Task”。有人对这个插件有经验吗?我没有尝试下载此扩展程序。
参考文献:
ps-script_excel-refresh-2-windows.png
SSISDB-IsolatedPackages-SSASUsageStats.dtsx.png
exceldataset-DBA.dbo.UsageStatsLogOLAP.png
答案 0 :(得分:1)
这听起来像一个痛苦的过程。如果是我,我将跳过SSIS包中的Excel + Powerquery位。只需将DMV视图中的数据(带有时间戳)直接加载到表中即可。最好是SQL Server 2016临时表。
然后,在SSIS流程之外为最终用户设置Excel电子表格,以从时态表查询中提取数据。由于时态表查询的性质,它们上的默认段/窗口将始终为“最新”(但是为时态表定义了它……)。
然后,您可以参数化发送回时间查询的时间段以捕获不同的窗口-设置“ Quanta”的Excel列表发送给时间查询,用户从列表中选择一个值,然后触发数据针对该“量子”进行刷新。
如果可以使用SQL Server 2016+,请对时态表和查询进行一些研究。听起来他们会帮助您在这里尝试做的事情。
然后在Excel工作簿(.xlsm)中,使它在打开工作簿时刷新PowerQuery数据,这应始终使它成为“最新”数据。
Excel通常不是放入自动数据分析过程中间的非常好的工具。它主要是一个用户端点工具。
如果您需要使用Powershell脚本来执行此操作,则可以使用许多Powershell脚本来“驱动” Excel(通过COM Interop)。这使从SSIS调用的Powershell进程负责在Powershell进程结束时拆除COM对象。
通过服务器上的COM Interop自动执行Excel可能会导致某些事件无法完全退出Excel,这将导致许多Excel僵尸进程占用资源。因此,如果您不能在Excel之后完全清理,就可以设置另一个定期杀死Excel僵尸进程的进程...(并且在网络上也有如何执行此操作的示例)。
如果必须从服务器进程(SSIS为...)创建Excel文件,过去我在SSIS中使用带有Powershell脚本的EPPlus .Net DLL取得了成功。 Powershell获取数据,然后调用EPPlus将数据直接写入Excel文件(.xlsx),而不需要或与Excel.exe进行交互。 (阅读作品也是如此)。
“ NPOI.dll”库是Java“ POI”库的.Net端口,它也可以写入“ Excel.Old”(.xls)文件以及.xlsx文件。它的工作方式类似于EPPlus。
这两种方法的最大优点(我怀疑您注意到Powerquery也不对数据起作用...),您可以避开Excel将应用于加载到工作簿中的数据的“帮助” 。 (例如,使用EPPlus,您可以将邮政编码或美国SSN作为文本值推送到单元格中-您可以控制单元格样式和显示格式。Excel会通过将其转换为数字数据来“帮助”您,从而避免丢失任何前导0。试图克服这种反帮助涉及许多不同的想法。