【问题标题】:How to get the collection of running packages from SSIS server?如何从 SSIS 服务器获取正在运行的包的集合?
【发布时间】:2014-12-24 21:54:20
【问题描述】:

我尝试在启动 SSIS 包后等到 SQL Server 上所有正在运行的包完成,但我无法找出正确的方法。我到目前为止的代码是:

var runningPackagesBefore = catalog.Executions.ToList();    

// [..] logic to start the package

while (true)
{
    // get all packages that are new
    catalog.Executions.Refresh();
    var newOperations = catalog.Executions.Except(runningPackagesBefore);

    // get all packages that are new, running and are in the same folder and project as the package
    var runningOperations =
        newOperations.Where(
            operation => operation.FolderName == catalogFolder.Name 
                && operation.ProjectName == project.Name 
                && operation.Status == Operation.ServerOperationStatus.Running);

    if (!runningOperations.Any())
    {
        break;
    }

    // [..] sleep and timeout logic here
}

catalog.Executions.Refresh() 调用有时会导致死锁问题。该文档还说“不要直接引用此方法......”。
需要刷新,否则执行集合会被缓存并返回 0 个新事务。并且当它在没有死锁的情况下运行时,它会正确返回正在运行的包的数量。

所以我试图找到一种方法来查看所有包是否都已完成运行。我正在运行的包是启动多个其他包的“主”包。否则我可以简单地获取执行 ID 并从目录中获取操作状态,但在这种情况下这是不可能的。

【问题讨论】:

    标签: c# sql-server ssis


    【解决方案1】:

    通过调用集成服务并获取新目录解决了这个问题。这会自动刷新它:

    // get all executions for this project that are currently running
    var runningPackagesBefore = catalog.Executions.Select(operation => operation.Id).ToList();
    
    // [..] logic to execute the package 
    
    while (true)
    {
        var integrationServices = new IntegrationServices(sqlConnection);
        Catalog refreshedCatalog = integrationServices.Catalogs[catalogName];
    
        // get all packages that are running
        var runningOperations = refreshedCatalog.Executions.Where(
            operation => operation.Status == Operation.ServerOperationStatus.Running);
    
        // get all packages that are new
        var newRunningOperations = runningOperations.Where(
            operation => !runningPackagesBefore.Contains(operation.Id));
    
        if (!newRunningOperations.Any())
        {
            break;
        }
    
        // [..] sleep and timeout logic here
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-28
      • 2015-11-05
      相关资源
      最近更新 更多