共用方式為


在遠端電腦上以程式設計方式執行 SSIS 封裝

如果用戶端 (本機) 電腦未安裝 Integration Services 或沒有封裝所需資源的存取權,您必須啟動封裝,以便在儲存封裝所在的遠端電腦上執行封裝。因為在同一部電腦上應用程式啟動封裝以及執行封裝,您必須採取額外步驟,以確保在遠端電腦上執行封裝。如果您直接從本機電腦上的應用程式執行遠端封裝,該封裝將載入並嘗試從本機電腦執行。因為本機電腦未安裝 Integration Services 或沒有封裝所需資源的存取權,將無法順利執行封裝。

[!附註]

因為 SQL Server 授權條款無法讓您在其他電腦上安裝 Integration Services,用戶端電腦可能未安裝 Integration Services (Integration Services 是伺服器元件,不可轉散發至用戶端電腦)。不過如果本機電腦已安裝 Integration Services 且有封裝所需資源的存取權,您就可以使用本機電腦來執行遠端封裝。如需詳細資訊,請參閱<以程式設計的方式在本機電腦上執行 SSIS 封裝>。

若要在遠端電腦上啟動封裝,您可以呼叫下列其中一個程式:

  • SQL Server Agent。

  • 在遠端電腦上執行的另一個應用程式、元件或 Web 服務。

本主題的章節

  • 遠端電腦的必要條件

  • 透過呼叫 SQL Server Agent,從遠端執行封裝

  • 透過呼叫遠端元件或服務,從遠端執行封裝

遠端電腦的必要條件

您必須確定在遠端電腦上執行封裝的程序擁有必要權限。此程序不但需要啟動封裝的權限,還需要尋找及開啟封裝所使用之所有資源的權限。預設權限通常不足,尤其是在 Web 架構方案的情況下。權限、驗證和授權的完整討論不在本主題的範圍之內。

模擬另一個帳戶來執行封裝,通常不是成功方案。儘管封裝會在模擬帳戶下啟動,但是封裝所建立的其他執行緒會還原為啟動封裝之程序所使用的帳戶。這些執行緒包含載入及儲存資料的資料流程所使用的執行緒。因此,處理帳戶本身需要封裝所使用之大部分外部資源的權限。

透過呼叫 SQL Server Agent,從遠端執行 SSIS 封裝

下列程式碼範例示範如何以程式設計方式呼叫 SQL Server Agent,在遠端電腦上執行封裝。範例程式碼會呼叫系統預存程序 sp_start_job,它將會啟動位於遠端電腦上的 SQL Server Agent 作業 (名稱為 RunSSISPackage)。RunSSISPackage 作業接著會在作業本身執行所在的遠端電腦上執行封裝。

[!附註]

sp_start_job 預存程序的傳回值指出預存程序是否能夠順利啟動 SQL Server Agent 作業。傳回值不會指出封裝是成功或是失敗。

如需有關從 SQL Server Agent 作業執行之封裝的疑難排解詳細資訊,請參閱 Microsoft 文件<從 SQL Server Agent 作業步驟呼叫 SSIS 封裝時,SSIS 封裝未執行>。

範例程式碼

下列程式碼範例需要使用 System.Data 組件的參考。

Imports System.Data
Imports System.Data.SqlClient

Module Module1

  Sub Main()

    Dim jobConnection As SqlConnection
    Dim jobCommand As SqlCommand
    Dim jobReturnValue As SqlParameter
    Dim jobParameter As SqlParameter
    Dim jobResult As Integer

    jobConnection = New SqlConnection("Data Source=(local);Initial Catalog=msdb;Integrated Security=SSPI")
    jobCommand = New SqlCommand("sp_start_job", jobConnection)
    jobCommand.CommandType = CommandType.StoredProcedure

    jobReturnValue = New SqlParameter("@RETURN_VALUE", SqlDbType.Int)
    jobReturnValue.Direction = ParameterDirection.ReturnValue
    jobCommand.Parameters.Add(jobReturnValue)

    jobParameter = New SqlParameter("@job_name", SqlDbType.VarChar)
    jobParameter.Direction = ParameterDirection.Input
    jobCommand.Parameters.Add(jobParameter)
    jobParameter.Value = "RunSSISPackage"

    jobConnection.Open()
    jobCommand.ExecuteNonQuery()
    jobResult = DirectCast(jobCommand.Parameters("@RETURN_VALUE").Value, Integer)
    jobConnection.Close()

    Select Case jobResult
      Case 0
        Console.WriteLine("SQL Server Agent job, RunSISSPackage, started successfully.")
      Case Else
        Console.WriteLine("SQL Server Agent job, RunSISSPackage, failed to start.")
    End Select
    Console.Read()

  End Sub

End Module
using System;
using System.Data;
using System.Data.SqlClient;

namespace LaunchSSISPackageAgent_CS
{
  class Program
  {
    static void Main(string[] args)
    {
      SqlConnection jobConnection;
      SqlCommand jobCommand;
      SqlParameter jobReturnValue;
      SqlParameter jobParameter;
      int jobResult;

      jobConnection = new SqlConnection("Data Source=(local);Initial Catalog=msdb;Integrated Security=SSPI");
      jobCommand = new SqlCommand("sp_start_job", jobConnection);
      jobCommand.CommandType = CommandType.StoredProcedure;

      jobReturnValue = new SqlParameter("@RETURN_VALUE", SqlDbType.Int);
      jobReturnValue.Direction = ParameterDirection.ReturnValue;
      jobCommand.Parameters.Add(jobReturnValue);

      jobParameter = new SqlParameter("@job_name", SqlDbType.VarChar);
      jobParameter.Direction = ParameterDirection.Input;
      jobCommand.Parameters.Add(jobParameter);
      jobParameter.Value = "RunSSISPackage";

      jobConnection.Open();
      jobCommand.ExecuteNonQuery();
      jobResult = (Int32)jobCommand.Parameters["@RETURN_VALUE"].Value;
      jobConnection.Close();

      switch (jobResult)
      {
        case 0:
          Console.WriteLine("SQL Server Agent job, RunSISSPackage, started successfully.");
          break;
        default:
          Console.WriteLine("SQL Server Agent job, RunSISSPackage, failed to start.");
          break;
      }
      Console.Read();
    }
  }
}

回到頁首

透過呼叫遠端元件或服務,從遠端執行 SSIS 封裝

在上節中,遠端電腦上以程式設計方式執行封裝的方案,並不需要遠端電腦上的任何自訂程式碼。不過,您可能偏好使用不需依賴 SQL Server Agent 的方案來執行封裝。

下列範例提供部分程式碼,可供伺服器上的遠端元件或 Web 服務啟動遠端電腦上的 Integration Services 封裝。

範例程式碼

下列程式碼範例示範如何建立及測試可從遠端執行封裝的遠端類別。這些範例並不完整,但提供的程式碼可做為建置為遠端元件或 Web 服務之方案的一部分。

這些範例需要使用 Microsoft.SqlServer.ManagedDTS 組件的參考。

建立函數,從遠端執行 SSIS 封裝

Integration Services 封裝可以直接從檔案、直接從 SQL Server 或從 SSIS 封裝存放區 (同時管理在 SQL Server 與特殊檔案系統資料夾中的封裝儲存體) 載入。為了支援所有可用的載入選項,這個範例使用 Select Case 或 switch 建構以選取適當的封裝啟動語法並適當地串連輸入引數。

重要事項重要事項

搭配 SSIS 封裝存放區使用的 Application 類別之方法,僅支援 "."、localhost 或是本機伺服器的伺服器名稱。您無法使用 "(local)"。

LaunchPackage 方法會以整數而不是 DTSExecResult 值傳回封裝執行的結果,因此用戶端電腦不需要任何 Integration Services 組件的參考。

重要事項重要事項

這個範例並不完整,但提供的程式碼可做為建置為遠端元件或 Web 服務之方案的一部分。範例未包含建置及公開遠端元件或服務所需的程式碼、屬性或參考。

若要建立遠端類別,以透過程式設計方式執行伺服器上的封裝

  1. 開啟 Visual Studio,以您慣用的程式語言建立適當類型的專案。

    下列範例程式碼使用 LaunchSSISPackageService 做為專案的名稱。

  2. 加入 Microsoft.SqlServer.ManagedDTS 組件的參考。

  3. 將範例程式碼貼到類別檔案。

    範例顯示程式碼視窗的整個內容。

  4. 加入建置及公開遠端元件或服務所需的程式碼、屬性或參考。

  5. 建置及測試包含範例程式碼的專案。

Imports Microsoft.SqlServer.Dts.Runtime
Imports System.IO

Public Class LaunchSSISPackageService

  ' LaunchPackage Method Parameters:
  ' 1. sourceType: file, sql, dts
  ' 2. sourceLocation: file system folder, (none), logical folder
  ' 3. packageName: for file system, ".dtsx" extension is appended

  Public Function LaunchPackage( _
    ByVal sourceType As String, _
    ByVal sourceLocation As String, _
    ByVal packageName As String) As Integer 'DTSExecResult

    Dim packagePath As String
    Dim myPackage As Package
    Dim integrationServices As New Application

    ' Combine path and file name.
    packagePath = Path.Combine(sourceLocation, packageName)

    Select Case sourceType
      Case "file"
        ' Package is stored as a file.
        ' Add extension if not present.
        If String.IsNullOrEmpty(Path.GetExtension(packagePath)) Then
          packagePath = String.Concat(packagePath, ".dtsx")
        End If
        If File.Exists(packagePath) Then
          myPackage = integrationServices.LoadPackage(packagePath, Nothing)
        Else
          Throw New ApplicationException( _
            "Invalid file location: " & packagePath)
        End If
      Case "sql"
        ' Package is stored in MSDB.
        ' Combine logical path and package name.
        If integrationServices.ExistsOnSqlServer(packagePath, ".", String.Empty, String.Empty) Then
          myPackage = integrationServices.LoadFromSqlServer( _
            packageName, "(local)", String.Empty, String.Empty, Nothing)
        Else
          Throw New ApplicationException( _
            "Invalid package name or location: " & packagePath)
        End If
      Case "dts"
        ' Package is managed by SSIS Package Store.
        ' Default logical paths are File System and MSDB.
        If integrationServices.ExistsOnDtsServer(packagePath, ".") Then
          myPackage = integrationServices.LoadFromDtsServer(packagePath, "localhost", Nothing)
        Else
          Throw New ApplicationException( _
            "Invalid package name or location: " & packagePath)
        End If
      Case Else
        Throw New ApplicationException( _
          "Invalid sourceType argument: valid values are 'file', 'sql', and 'dts'.")
    End Select

    Return myPackage.Execute()

  End Function

End Class
using Microsoft.SqlServer.Dts.Runtime;
using System.IO;

public class LaunchSSISPackageServiceCS
{
  public LaunchSSISPackageServiceCS()
  {
    }

  // LaunchPackage Method Parameters:
  // 1. sourceType: file, sql, dts
  // 2. sourceLocation: file system folder, (none), logical folder
  // 3. packageName: for file system, ".dtsx" extension is appended

  public int LaunchPackage(string sourceType, string sourceLocation, string packageName)
  { 

    string packagePath;
    Package myPackage;
    Application integrationServices = new Application();

    // Combine path and file name.
    packagePath = Path.Combine(sourceLocation, packageName);

    switch(sourceType)
    {
      case "file":
        // Package is stored as a file.
        // Add extension if not present.
        if (String.IsNullOrEmpty(Path.GetExtension(packagePath)))
        {
          packagePath = String.Concat(packagePath, ".dtsx");
        }
        if (File.Exists(packagePath))
        {
          myPackage = integrationServices.LoadPackage(packagePath, null);
        }
        else
        {
          throw new ApplicationException("Invalid file location: "+packagePath);
        }
        break;
      case "sql":
        // Package is stored in MSDB.
        // Combine logical path and package name.
        if (integrationServices.ExistsOnSqlServer(packagePath, ".", String.Empty, String.Empty))
        {
          myPackage = integrationServices.LoadFromSqlServer(packageName, "(local)", String.Empty, String.Empty, null);
        }
        else
        {
          throw new ApplicationException("Invalid package name or location: "+packagePath);
        }
        break;
      case "dts":
        // Package is managed by SSIS Package Store.
        // Default logical paths are File System and MSDB.
        if (integrationServices.ExistsOnDtsServer(packagePath, "."))
        {
          myPackage = integrationServices.LoadFromDtsServer(packagePath, "localhost", null);
        }
        else
        {
          throw new ApplicationException("Invalid package name or location: "+packagePath);
        }
        break;
      default:
        throw new ApplicationException("Invalid sourceType argument: valid values are 'file', 'sql', and 'dts'.");
    }

    return (Int32)myPackage.Execute();

  }

}

呼叫函數,從遠端執行 SSIS 封裝

下列範例主控台應用程式使用遠端元件或服務執行封裝。

遠端類別的 LaunchPackage 方法會以整數而不是 DTSExecResult 值傳回封裝執行的結果,因此用戶端電腦不需要任何 Integration Services 組件的參考。範例會建立一個私用列舉,其值會鏡像 DTSExecResult 值,以報告執行的結果。

若要建立主控台應用程式以測試遠端類別

  1. 在 Visual Studio 中,以您慣用的程式語言建立新的主控台應用程式。

    範例程式碼使用 LaunchSSISPackageTest 做為專案的名稱。

  2. 加入代表遠端元件或服務之本機 Proxy 組件的參考。若有需要,請在範例程式碼中,為指派到 Proxy 物件的名稱,調整變數宣告。

  3. 將 Main 常式與私用列舉的範例程式碼貼到程式碼中。

    範例顯示程式碼視窗的整個內容。

  4. 編輯呼叫 LaunchPackage 方法的程式碼行,為其輸入引數提供一組指向現有封裝的有效值。

    例如,如果 package1.dtsx 是儲存在伺服器上的 C:\My Packages 中,則傳遞 "file" 做為 sourceType 的值,傳遞 "C:\My Packages" 做為 sourceLocation 的值,並傳遞 "package1" (沒有副檔名) 做為 packageName 的值。

Module LaunchSSISPackageTest

  Sub Main()

    Dim launchPackageService As New LaunchSSISPackageService.LaunchSSISPackageService
    Dim packageResult As Integer

    Try
      packageResult = launchPackageService.LaunchPackage("sql", String.Empty, "SimpleTestPackage")
    Catch ex As Exception
      Console.WriteLine("The following exception occurred: " & ex.Message)
    End Try

    Console.WriteLine(CType(packageResult, PackageExecutionResult).ToString)
    Console.ReadKey()

  End Sub

  Private Enum PackageExecutionResult
    PackageSucceeded
    PackageFailed
    PackageCompleted
    PackageWasCancelled
  End Enum

End Module
using System;

namespace LaunchSSISPackageSvcTestCS
{
  class Program
  {
    static void Main(string[] args)
    {
      LaunchSSISPackageServiceCS.LaunchSSISPackageServiceCS launchPackageService = new LaunchSSISPackageServiceCS.LaunchSSISPackageServiceCS();
      int packageResult = 0;

      try
      {
        packageResult = launchPackageService.LaunchPackage("sql", String.Empty, "SimpleTestPackage");
      }
      catch (Exception ex)
      {
        Console.WriteLine("The following exception occurred: " + ex.Message);
      }

      Console.WriteLine(((PackageExecutionResult)packageResult).ToString());
      Console.ReadKey();

    }

    private enum PackageExecutionResult
    {
      PackageSucceeded,
      PackageFailed,
      PackageCompleted,
      PackageWasCancelled
    };

  }
}

回到頁首

外部資源

Integration Services 圖示 (小) 掌握 Integration Services 的最新狀態

若要取得 Microsoft 的最新下載、文件、範例和影片以及社群中的選定解決方案,請瀏覽 MSDN 上的 Integration Services 頁面:


若要得到這些更新的自動通知,請訂閱該頁面上所提供的 RSS 摘要。