代码之家  ›  专栏  ›  技术社区  ›  SherlockSpreadsheets

PowerShell刷新Excel而不打开Excel文件(使用SQL代理的包计划执行问题)

  •  1
  • SherlockSpreadsheets  · 技术社区  · 5 年前

    我开发了一个SSIS包,其中包含“执行流程任务”和“数据流任务”。我在执行程序包时遇到了问题。

    结果:(手动与计划)

    当我使用特定的用户配置文件'GEORGES/BL0040EP'登录时。

    1. “执行进程任务”--运行powershell脚本以刷新excel连接并保存excel文件。 (成功)
    2. “数据流任务”--读取excel数据并将其插入SQL Server表。 (成功)

    我正试着用 SQL代理

    1. “执行进程任务”--运行powershell脚本以刷新excel连接 (不工作,没有错误消息) . 保存excel文件 .
    2. “数据流任务”--读取excel数据并将其插入SQL Server表。 (成功)

    powershell script to refresh the Excel file 从运行时似乎不会向SSAS服务器发出 SQL Agent . 不是“查询问题成功”。不是“查询权限错误问题”。简单地说就是“根本不执行查询”。未记录或检测到任何权限问题。

    问题:

    为什么SQL代理不运行查询?

    $env:UserName | Out-File -filepath 输出包含用户名的文本文件。代理帐户设置似乎正在预期的用户配置文件上下文下运行。文本文件的内容是 bl0040ep .


    创建代理帐户

    Creating a Proxy User to run an SSIS package in SQL Server Agent

    USE master 
    GO
    
    -- Create a proxy credential for xp_cmdshell.
    EXEC sp_xp_cmdshell_proxy_account 'GEORGES\bl0040ep', '!myPW!';--SELECT  * FROM [master].[sys].[credentials]
    
    -- Grant execute permission on xp_cmdshell to the SQL Server login account. 
    GRANT exec ON sys.xp_cmdshell TO [GEORGES\bl0040ep] 
    GO
    
    -- Create a credential containing the GEORGES account PowerGEORGES\PowerUser and its password
    CREATE CREDENTIAL Credential_BL0040EP WITH IDENTITY = N'GEORGES\bl0040ep', SECRET = N'!myPW!'
    GO
    
    USE [msdb]
    GO
    -- Create a new proxy called SSISProxy and assign the PowerUser credentail to it
    EXEC msdb.dbo.sp_add_proxy @proxy_name=N'Proxy_BL0040EP',@credential_name=N'Credential_BL0040EP',@enabled=1
    
    -- Grant SSISProxy access to the "SSIS package execution" subsystem
    EXEC msdb.dbo.sp_grant_proxy_to_subsystem @proxy_name=N'Proxy_BL0040EP', @subsystem_id=11
    
    -- Grant the login testUser the permissions to use SSISProxy
    EXEC msdb.dbo.sp_grant_login_to_proxy @login_name = N'GEORGES\bl0040ep', @proxy_name=N'Proxy_BL0040EP'
    GO
    

    数据库sas\u UsageStats\u xlsx\u ExcelRefresh.ps1

    enter image description here

    # Refresh the excel workbook connections and save the updated file
    $file = 'C:\SVN\BusinessAnalysts\ExcelTools\DatabaseSSAS_UsageStats.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'
    $filename = 'C:\SVN\BusinessAnalysts\ExcelTools\DatabaseSSAS_UsageStats.xlsx' 
    $env:UserName | Out-File -filepath C:\SVN\BusinessAnalysts\ExcelTools\RefreshAll_process.txt
    $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
    

    SQL分析器

    SQLProfiler(VS/SSIDB-connectionerror\u user-bl0040).png

    enter image description here

    SQLProfiler(SQLAGENT-connection\u no-activity).png

    没有图像可以附加。当包在SQL代理上下文下运行时,用户(bl0040ep)没有任何活动。


    更新1:系统桌面文件夹

    Issues with simple script executed via SQL Server Agent ... C:\Windows\System32\config\systemprofile\Desktop C:\Windows\SysWOW64\config\systemprofile\Desktop . 该文件夹已存在于SysWOW64上。

    更新2:32位PowerShell可执行文件

    我还尝试直接调用32位版本的PowerShell: %SystemRoot%\syswow64\WindowsPowerShell\v1.0\powershell.exe Run a 32 bit Powershell script on Sql Server Agent

    更新3:Windows任务计划程序代替SQL代理作业

    Nirav's Diary, Schedule SSIS Package Without Deploying, 2-Windows Schedule Task

    0 回复  |  直到 5 年前
        1
  •  0
  •   SherlockSpreadsheets    5 年前

    我已经解决了这个问题,从图片中删除Excel。我现在使用的不是Excel源,而是连接器 .Net Providers for OleDb\Microsoft OLE DB Provider for Analysis Services 2.0 . 在数据库中需要几个额外的步骤来获得相同的数据集(使用 SQL Views Excel Powerquery M ).

    enter image description here