【问题标题】:Assembling SSIS Packages in PowerShell在 PowerShell 中组装 SSIS 包
【发布时间】:2011-06-20 04:59:06
【问题描述】:

我应该先说我在 OOP 语言中编写脚本或编程的经验有限。

我正在研究一种使用 PowerShell 以编程方式创建和执行 SSIS 包的方法。不幸的是,大多数可用于 PowerShell 和 SSIS 的资源都是用于从 SSIS 调用 PS,而不是相反。

不过,我找到了许多用于创建 SSIS 包的 VB/C# 资源。

Example resource here.

我已通过调用 DTS/SSIS 程序集成功转换了大部分代码,但现在将 TaskHost 对象转换为主管失败了。

示例代码:

[Void][Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.ManagedDTS')
[Void][Reflection.Assembly]::LoadWithPartialName('Microsoft.Sqlserver.DTSPipelineWrap')

# Create the Package and application, set its generic attributes

$Package = New-Object Microsoft.SqlServer.Dts.Runtime.Package
$Package.CreatorName = $CreatorName

$App = New-Object Microsoft.SqlServer.Dts.Runtime.Application

# Set connection info for our package

$SourceConn = $package.Connections.Add("OLEDB")
$SourceConn.Name = "Source Connection"
$SourceConn.set_ConnectionString("Data Source=$SourceServer;Integrated Security=True")

$TargetConn = $package.Connections.Add("OLEDB")
$TargetConn.Name = "Target Connection"
$TargetConn.set_ConnectionString("Data Source=$TargetServer;Integrated Security=True")

# Build the tasks

# Data Flow Task - actually move the table

[Microsoft.SQLServer.DTS.Runtime.Executable]$XferTask = $Package.Executables.Add("STOCK:PipelineTask")

$XferTaskTH = [Microsoft.SqlServer.Dts.Runtime.TaskHost]$XferTask

$XferTaskTH.Name = "DataFlow"
$XferTaskTH.Description = "Dataflow Task Host"

$DataPipe = [Microsoft.SQLServer.DTS.pipeline.Wrapper.MainPipeClass]($XferTaskTH.InnerObject)

一切正常,直到最后一行,当我收到错误时:

无法转换 "System.__ComObject" 类型的值 "System.__ComObject#{}" 到 类型 "Microsoft.SqlServer.Dts.Pipeline.Wrapper.MainPipeClass"

欢迎任何帮助或想法!

【问题讨论】:

  • 我赞成这个老问题,因为我不明白为什么它有反对票=/
  • @jadarnel27 - 他们大多是报复性的反对票。我激怒了某人,他们对我提出的几个问题投了反对票(因为可以免费对问题投反对票)。我很欣赏你的公平感。

标签: sql-server sql-server-2008 powershell ssis dts


【解决方案1】:

您总是可以将上面引用的工作 .NET 版本编译成一个 exe,并允许它根据需要接受参数以创建 SSIS 包。然后,根据需要使用 Powershell 调用带有参数的可执行文件。

【讨论】:

  • 假设出于安全原因,它需要是一个自包含的 powershell 脚本,将从 SQL Server 执行。
【解决方案2】:

Microsoft.SqlServer.DTSPipelineWrap 大量使用 COM 实例。

此论坛帖子建议使用 CreateWRapperOfType 方法: http://social.technet.microsoft.com/Forums/en-US/ITCG/thread/0f493a31-fbf0-46ac-a6a5-8a10af8822cf/

你可以试试这个:

$DataPipe = [System.Runtime.InteropServices.Marshal]::CreateWrapperOfType($XferTaskTH.InnerObject, [Microsoft.SQLServer.DTS.pipeline.Wrapper.MainPipeClass])

不会出错并生成对象——我不确定是什么类型。

【讨论】:

  • 我现在放弃了这个项目(我正在直接编辑 xml),但这让我很接近!
  • @JNK - 你有没有回到这个工作?成功了吗?
猜你喜欢
  • 1970-01-01
  • 2017-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多