我在通过SSIS-Script任务处理SQL 2016表格模型时遇到问题。
在SSIS脚本任务中,我通过以下方式调用powershell脚本:
RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create();
Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration);
runspace.Open();
// Configure Variables
Pipeline pipeline = runspace.CreatePipeline();
string query = Dts.Variables["XMLA"].Value.ToString();
//Read in powershell script
string script = readFile(@"folder");
script = script.Replace("plchldr_query", query);
pipeline.Commands.AddScript(script);
writeFile(@"folder", script);
try
{
pipeline.Invoke();
} catch(Exception e)
{
writeFile(@"folder", e.Message);
}
这个powershell脚本只包含两行(加上一些用于调试的行):
Import-Module SQLASCMDLETS -Verbose 4>&1 | Out-File "folder\filename.txt"
Invoke-ASCmd -Query "plchldr_query" -Server "Servername\TABULAR"
不幸的是,当我启动SSIS包时,Invoke-ASCmd失败并显示错误消息:
无法加载文件或程序集 'Microsoft.AnalysisServices.PowerShell.Cmdlets'或其中一个 依赖。指针无效(HRESULT异常:0x80004003 (E_POINTER))
当我直接在powershell中启动完全相同的脚本时,一切正常。
对我而言,问题可能与不同的主机有关。当我直接在powershell中启动脚本时,主机是“Console Host”(版本4.0)。但是当我通过SSIS-Task启动脚本时,主机是“默认主机”(版本4.0)。
要检查哪些模块可用,我确实执行了命令:
Get-Module -ListAvailable | out-file "folder\file"
我认为这个列表可能有所不同,但是直接在powershell中或通过SSIS执行此命令无关紧要,结果是一样的:
ModuleType Name ExportedCommands
---------- ---- ----------------
Manifest SqlServer {Invoke-ProcessCube, New-SqlCngColumnMas...
Manifest BitsTransfer {Complete-BitsTransfer, Add-BitsFile, Re...
Manifest CimCmdlets {New-CimSessionOption, Get-CimAssociated...
Script ISE {Import-IseSnippet, Get-IseSnippet, New-...
Manifest Microsoft.PowerShell.Diagnostics {New-WinEvent, Export-Counter, Get-WinEv...
Manifest Microsoft.PowerShell.Host {Start-Transcript, Stop-Transcript}
Manifest Microsoft.PowerShell.Management {Remove-WmiObject, Remove-EventLog, Add-...
Manifest Microsoft.PowerShell.Security {Get-Credential, Get-Acl, Set-Authentico...
Manifest Microsoft.PowerShell.Utility
Manifest Microsoft.WSMan.Management {Test-WSMan, Set-WSManInstance, Get-WSMa...
Manifest PSDiagnostics {Set-LogProperties, Enable-WSManTrace, S...
Binary PSScheduledJob {Get-JobTrigger, Add-JobTrigger, Get-Sch...
Manifest TroubleshootingPack {Get-TroubleshootingPack, Invoke-Trouble...
Manifest AppvClient
Binary ThirdPartyNotice
Binary UEV {Restore-UevUserSetting, Get-UevAppxPack...
Manifest SQLASCMDLETS {Add-RoleMember, New-RestoreFolder, Invo...
Manifest SQLPS {Backup-ASDatabase, Get-SqlInstance, New...
所以,现在我完全陷入了困境。对我来说,两种类型的执行之间的唯一区别是执行脚本的主机。但是两个主机都有相同的模块可用。您是否可能有另外一个想法可能导致这种不同的行为?
提前致谢!
更新
我现在通过Import-Module SQLASCMDLETS
检查了-Verbose
来电。当我在powershell中执行此命令时,我得到以下输出:
Importing cmdlet 'Add-RoleMember'.
Importing cmdlet 'Backup-ASDatabase'.
Importing cmdlet 'Invoke-ASCmd'.
Importing cmdlet 'Invoke-ProcessASDatabase'.
Importing cmdlet 'Invoke-ProcessCube'.
Importing cmdlet 'Invoke-ProcessDimension'.
Importing cmdlet 'Invoke-ProcessPartition'.
Importing cmdlet 'Invoke-ProcessTable'.
Importing cmdlet 'Merge-Partition'.
Importing cmdlet 'New-RestoreFolder'.
Importing cmdlet 'New-RestoreLocation'.
Importing cmdlet 'Remove-RoleMember'.
Importing cmdlet 'Restore-ASDatabase'.
使用SSIS执行的输出是:
从路径'C:\ Program Files(x86)\ Microsoft SQL加载模块 服务器\ 130个\ TOOLS \ PowerShell的\模块\ SQLASCMDLETS \ SQLASCMDLETS.psd1' 。 从路径'C:\ Program Files(x86)\ Microsoft SQL加载模块 服务器\ 130个\工具\ PowerShell的\模块\ SQLASCMDLETS \ Microsoft.AnalysisServices.PowerShell.Cmdlets.dl L”。
我检查过这些文件存在于文件夹中。但这些消息对我而言似乎是模块的加载方式不同。这有可能吗?如果是的话,有人知道为什么吗?或者我是否误解了不同的输出?