【问题标题】:Executing SSIS packages from the SSIS catalog on SQL Server 2012从 SQL Server 2012 上的 SSIS 目录执行 SSIS 包
【发布时间】:2014-07-21 12:51:14
【问题描述】:

使用 SQL Server 2012 的新 SSIS 目录,以前通过 C#本地 从 SQL Server 执行 SSIS 包的方式(它基本上是下载包并在调用者机器上执行它)没有更长的工作时间:

Application app = new Application();
Package pkg = app.LoadFromSqlServer("\\FolderRoot", "myserver", null, null, null);
pkg.Execute();

MSDN 文章Loading and Running a Local Package Programmatically 中讨论了这种方法。

对于 SQL Server 2012,使用 SSIS 目录方法,执行 SSIS 包的新方法似乎是使用 Microsoft.SqlServer.Management.IntegrationServices 命名空间中的类。令我困惑的是,微软没有为这种处理包执行的新方法提供任何有用的文档。 following blog post 建议使用以下方法:

SqlConnection ssisConnection = new SqlConnection(@"Data Source=.\SQL2012;Initial Catalog=master;Integrated Security=SSPI;");
IntegrationServices ssisServer = new IntegrationServices(ssisConnection);
PackageInfo ssisPackage = ssisServer.Catalogs["SSISDB"].Folders["MasterChild"].Projects["MasterChildPackages"].Packages["master.dtsx"];
long executionIdentifier = ssisPackage.Execute(false, null, executionParameter);

但是,这不会在本地执行,而是在服务器上运行。我的问题是,使用远程 SQL Server 2012 上的 SSIS 目录,是否仍然可以从该远程服务器在我自己的计算机上本地执行包?

【问题讨论】:

  • 我从未尝试过以编程方式从 SSISDB 执行包。但是,SSIDB 中的包不仅仅是一个独立的包。它是一个项目的一部分。包必须在项目的上下文中执行,这只能通过 SSIDB 完成。
  • 没错,包需要在其项目的上下文中执行。因此,真正的问题是如何在我的 PC 上本地执行整个远程部署的项目?
  • 使用 Microsoft.SqlServer.Dts.Runtime;你试过这个命名空间吗..你想在 C# 代码中执行它吗?
  • @Govind 是的,我想在 C# 中执行它。该命名空间不适用于将包存储在 SSIS 目录中的 SQL Server。

标签: c# ssis sql-server-2012


【解决方案1】:

定义“不起作用”。正如我从文档中看到的那样,您提供的相同代码(适用于

确保您引用的是这个 dll,而不是旧的:

C:\Program Files (x86)\Microsoft SQL Server\110\SDK\Assemblies\Microsoft.SqlServer.ManagedDTS.dll

//编辑;看来你现在确实是对的:http://technet.microsoft.com/en-us/library/ms141708.aspx

也许这会让你继续前进(ps我不知道这是否可行,但我看到了一些有用的方法,也许你可以让它发挥作用):

var projectBytes = ssisServer.Catalogs["SSISDB"]
                             .Folders["MasterChild"]
                             .Projects["MasterChildPackages"].GetProjectBytes();

// note that projectBytes is basically __URFILE__.ispac      
using (var existingProject = Project.OpenProject(new MemoryStream(projectBytes)))
{
    existingProject.PackageItems["master.dtsx"].Package.Execute(.... todo ....)
}

【讨论】:

  • 您提供的代码在服务器上执行项目。这不是我想要达到的目标。
  • 尝试相同的代码,但将 projectBytes 保存为 yourFIle.ispac,然后尝试执行 dtexec /Project yourFIle.ispac /package master.dtsx。如果确实在本地执行,我会尝试使用 APIMONITOR 来查看它正在调用什么方法。如果这不能在本地执行,我不认为 SSIS 包可以在本地执行,尽管我没有找到任何“证明”或反证明。
  • 实际上,您的代码看起来可能是我需要的。我目前正在对此进行测试!
  • 这绝对是在本地运行项目。非常感谢!
猜你喜欢
  • 2014-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-06
  • 1970-01-01
相关资源
最近更新 更多