.NET에서 SSIS 패키지를 실행하는 방법은 무엇입니까?


85

나는 결국 매개 변수를 전달하고 싶은 SSIS 패키지가 있습니다. 이러한 매개 변수는 .NET 응용 프로그램 (VB 또는 C #)에서 제공되므로이 작업을 수행하는 방법을 아는 사람이 있는지 또는 유용한 힌트가있는 웹 사이트가 있는지 궁금합니다. 어떻게하는지.

그래서 기본적으로 .NET에서 SSIS 패키지를 실행하고 그 안에서 사용할 수있는 SSIS 패키지 매개 변수를 전달하고 싶습니다.

예를 들어 SSIS 패키지는 SQL db로 가져 오는 플랫 파일을 사용하지만 파일의 경로와 이름은 .Net 응용 프로그램에서 전달되는 매개 변수가 될 수 있습니다.



10
향후 독자에게 : 아래 솔루션을 사용하기 전에 라이선스를 검토하십시오. DLL 참조뿐만 아니라 SSIS가 설치된 컴퓨터에서만 작동한다고 생각합니다. 프로덕션 환경에서는 일반적으로 DB 엔진 자체를 설치하지 않고 SSIS를 설치하는 경우에도 라이선스가 필요합니다.
John Spiegel 2013

누구든지 @JohnSpiegel의 의견을 확인할 수 있습니까? SSIS가 설치된 경우 프로덕션 환경에서만 작동합니까?
Josh Noe 2011

참고로, 프로그래밍 방식으로 SSIS 패키지 실행 링크가 docs.microsoft.com/en-us/archive/blogs/michen/…
LoJo

답변:


58

다음은 코드에서 패키지에 변수를 설정하는 방법입니다.

using Microsoft.SqlServer.Dts.Runtime;

private void Execute_Package()
    {           
        string pkgLocation = @"c:\test.dtsx";

        Package pkg;
        Application app;
        DTSExecResult pkgResults;
        Variables vars;

        app = new Application();
        pkg = app.LoadPackage(pkgLocation, null);

        vars = pkg.Variables;
        vars["A_Variable"].Value = "Some value";               

        pkgResults = pkg.Execute(null, vars, null, null, null);

        if (pkgResults == DTSExecResult.Success)
            Console.WriteLine("Package ran successfully");
        else
            Console.WriteLine("Package failed");
    }

2
@IanCampbell 나는 당신이 Microsoft.SqlServer.Dts.Runtime을 언급하고 있다고 가정합니까? Dts는 SSIS의 레거시 이름 일 뿐이며 네임 스페이스 선언 일뿐입니다. 위의 코드는 앞으로 지원됩니다.
Spikeh

3
@IanCampbell 예, DTS는 감가 상각되었습니다 (사실, SQL Server의 최신 버전에서 DTS를 사용할 수 있다고 생각하지 않습니다. 그러나 일부 SSIS 구성 요소를 포함하는 .Net 네임 스페이스에는 여전히 Dts 단어가 포함되어 있습니다. 현재 버전이며 유효하다고 확신합니다.
Spikeh

4
좋아, 감사합니다 @Spikeh! 참고로 최근에 Dts로 SSIS 패키지를로드하기 위해 유사한 코드를 구현했을 때 이러한 코드를 컴파일 Microsoft.SqlServer.ManagedDTS.dll하려면 C:\Windows\assembly폴더 의 "GAC"에서 파일 을 수동으로 가져와야했습니다 .
Ian Campbell

3
예, 저도 그랬습니다. 저도 어제 똑같은 일을했습니다! VS2012 및 .Net 4 (SSIS 패키지 용) /4.5 (단위 테스트 용)를 사용하고 있습니다. 다른 어셈블리 폴더에 존재하지 않기 때문에 C : \ Windows \ Microsoft.NET \ assembly \ GAC_MSIL \ Microsoft.SqlServer.ManagedDTS \ v4.0_11.0.0.0__89845dcd8080cc91에서 어셈블리를 가져와야했습니다. SQL 폴더.
Spikeh

1
MSDN에 대한 일부 링크 : 1) 로컬 패키지 (동일한 시스템) : msdn.microsoft.com/en-us/library/ms136090.aspx . 2) SQL 에이전트 작업을 사용하는 원격 패키지 (프로그램이 실행중인 시스템이 아닌 다른 시스템에 저장 됨) : msdn.microsoft.com/en-us/library/ms403355.aspx
Faiz

21

SQL Server 2012에 도입 된 SSDB 카탈로그를 사용하여 수행하는 방법은 다음과 같습니다.

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data.SqlClient;

using Microsoft.SqlServer.Management.IntegrationServices;

public List<string> ExecutePackage(string folder, string project, string package)
{
    // Connection to the database server where the packages are located
    SqlConnection ssisConnection = new SqlConnection(@"Data Source=.\SQL2012;Initial Catalog=master;Integrated Security=SSPI;");

    // SSIS server object with connection
    IntegrationServices ssisServer = new IntegrationServices(ssisConnection);

    // The reference to the package which you want to execute
    PackageInfo ssisPackage = ssisServer.Catalogs["SSISDB"].Folders[folder].Projects[project].Packages[package];

    // Add a parameter collection for 'system' parameters (ObjectType = 50), package parameters (ObjectType = 30) and project parameters (ObjectType = 20)
    Collection<PackageInfo.ExecutionValueParameterSet> executionParameter = new Collection<PackageInfo.ExecutionValueParameterSet>();

    // Add execution parameter (value) to override the default asynchronized execution. If you leave this out the package is executed asynchronized
    executionParameter.Add(new PackageInfo.ExecutionValueParameterSet { ObjectType = 50, ParameterName = "SYNCHRONIZED", ParameterValue = 1 });

    // Add execution parameter (value) to override the default logging level (0=None, 1=Basic, 2=Performance, 3=Verbose)
    executionParameter.Add(new PackageInfo.ExecutionValueParameterSet { ObjectType = 50, ParameterName = "LOGGING_LEVEL", ParameterValue = 3 });

    // Add a project parameter (value) to fill a project parameter
    executionParameter.Add(new PackageInfo.ExecutionValueParameterSet { ObjectType = 20, ParameterName = "MyProjectParameter", ParameterValue = "some value" });

    // Add a project package (value) to fill a package parameter
    executionParameter.Add(new PackageInfo.ExecutionValueParameterSet { ObjectType = 30, ParameterName = "MyPackageParameter", ParameterValue = "some value" });

    // Get the identifier of the execution to get the log
    long executionIdentifier = ssisPackage.Execute(false, null, executionParameter);

    // Loop through the log and do something with it like adding to a list
    var messages = new List<string>();
    foreach (OperationMessage message in ssisServer.Catalogs["SSISDB"].Executions[executionIdentifier].Messages)
    {
        messages.Add(message.MessageType + ": " + message.Message);
    }

    return messages;
}

이 코드는 http://social.technet.microsoft.com/wiki/contents/articles/21978.execute-ssis-2012-package-with-parameters-via-net.aspx?CommentPosted=true#commentmessage를 약간 수정 한 것입니다 .

http://domwritescode.com/2014/05/15/project-deployment-model-changes/ 에도 유사한 기사가 있습니다.


microsoft.sqlserver.management.integrationservices.dll은 어디에 있습니까? SQL2014가 설치되어 있는데 Windows 검색에서 찾을 수 없습니다.


패키지 배포에 위 코드를 사용할 수 있습니까? 방법을 찾을 수 없습니다.
Manish Jain

7

@Craig Schwarze 답변에 추가하려면,

다음은 몇 가지 관련 MSDN 링크입니다.

프로그래밍 방식으로 로컬 패키지로드 및 실행 :

프로그래밍 방식으로 원격 패키지로드 및 실행

실행중인 패키지에서 이벤트 캡처 :

using System;
using Microsoft.SqlServer.Dts.Runtime;

namespace RunFromClientAppWithEventsCS
{
  class MyEventListener : DefaultEvents
  {
    public override bool OnError(DtsObject source, int errorCode, string subComponent, 
      string description, string helpFile, int helpContext, string idofInterfaceWithError)
    {
      // Add application-specific diagnostics here.
      Console.WriteLine("Error in {0}/{1} : {2}", source, subComponent, description);
      return false;
    }
  }
  class Program
  {
    static void Main(string[] args)
    {
      string pkgLocation;
      Package pkg;
      Application app;
      DTSExecResult pkgResults;

      MyEventListener eventListener = new MyEventListener();

      pkgLocation =
        @"C:\Program Files\Microsoft SQL Server\100\Samples\Integration Services" +
        @"\Package Samples\CalculatedColumns Sample\CalculatedColumns\CalculatedColumns.dtsx";
      app = new Application();
      pkg = app.LoadPackage(pkgLocation, eventListener);
      pkgResults = pkg.Execute(null, null, eventListener, null, null);

      Console.WriteLine(pkgResults.ToString());
      Console.ReadKey();
    }
  }
}

1

따라서 실제로 어떤 언어에서든 실행할 수있는 또 다른 방법이 있습니다. 내가 생각하는 가장 좋은 방법은 .dtsx 패키지를 호출하는 배치 파일을 만들 수 있다는 것입니다.

다음으로 모든 언어에서 배치 파일을 호출합니다. Windows 플랫폼에서와 마찬가지로 어디에서나 배치 파일을 실행할 수 있으며 이것이 귀하의 목적에 가장 일반적인 접근 방식이라고 생각합니다. 코드 종속성이 없습니다.

자세한 내용은 블로그입니다 ..

https://www.mssqltips.com/sqlservertutorial/218/command-line-tool-to-execute-ssis-packages/

행복한 코딩 .. :)

고마워, Ayan


0

SSIS에 변수가있는 경우이 함수를 사용할 수 있습니다.

    Package pkg;

    Microsoft.SqlServer.Dts.Runtime.Application app;
    DTSExecResult pkgResults;
    Variables vars;

    app = new Microsoft.SqlServer.Dts.Runtime.Application();
    pkg = app.LoadPackage(" Location of your SSIS package", null);

    vars = pkg.Variables;

    // your variables
    vars["somevariable1"].Value = "yourvariable1";
    vars["somevariable2"].Value = "yourvariable2";

    pkgResults = pkg.Execute(null, vars, null, null, null);

    if (pkgResults == DTSExecResult.Success)
    {
        Console.WriteLine("Package ran successfully");
    }
    else
    {

        Console.WriteLine("Package failed");
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.