以程式設計方式使用變數

變數是在封裝、容器、工作及事件處理常式中動態設定值和控制處理序的方式。 優先順序條件約束也可以使用變數,以控制資料流向不同工作的方向。 變數有各種不同的用途:

影響範圍

每個容器有它自己的 Variables 集合。 在建立新變數時,它在其父容器的範圍內。 因為封裝容器位於容器階層的最上層,所以具有封裝範圍的變數在功能上與全域變數相同,而且在封裝中的所有容器都可以看到它們。 透過使用集合中的變數名稱或是變數的索引,容器的子系也可以透過 Variables 集合來存取容器的變數集合。

因為變數的可見性範圍是從上向下,所以封裝中的所有容器都可以看到在封裝層級宣告的變數。 因此,在容器上的 Variables 集合除了自己的變數以外,還會包括屬於其父系的所有變數。

相反的,包含在工作中的變數其範圍和可見性則有限,只有工作看得到它們。

如果封裝執行其他封裝,則定義在呼叫封裝範圍中的變數可用於所呼叫的封裝。 只有在所呼叫的封裝中有相同名稱的變數時,才會發生例外狀況。 發生衝突時,在所呼叫的封裝中之變數值會覆寫來自呼叫封裝的值。 定義在所呼叫的封裝範圍中之變數絕對無法用於呼叫封裝中。

下列程式碼範例以程式設計方式在封裝範圍建立變數 myCustomVar,然後在封裝可看見的所有變數中反覆運算,以列印其名稱、資料類型與值。

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

namespace Microsoft.SqlServer.Dts.Samples
{
  class Program
  {
    static void Main(string[] args)
    {
      Application app = new Application();
      // Load a sample package that contains a variable that sets the file name.
      Package pkg = app.LoadPackage(
        @"C:\Program Files\Microsoft SQL Server\100\Samples\Integration Services" +
        @"\Package Samples\CaptureDataLineage Sample\CaptureDataLineage\CaptureDataLineage.dtsx",
        null);
      Variables pkgVars = pkg.Variables;
      Variable myVar = pkg.Variables.Add("myCustomVar", false, "User", "3");
      foreach (Variable pkgVar in pkgVars)
      {
        Console.WriteLine("Variable: {0}, {1}, {2}", pkgVar.Name,
          pkgVar.DataType, pkgVar.Value.ToString());
      }
      Console.Read();
    }
  }
}
Imports Microsoft.SqlServer.Dts.Runtime

Module Module1

  Sub Main()

    Dim app As Application = New Application()
    ' Load a sample package that contains a variable that sets the file name.
    Dim pkg As Package = app.LoadPackage( _
      "C:\Program Files\Microsoft SQL Server\100\Samples\Integration Services" & _
      "\Package Samples\CaptureDataLineage Sample\CaptureDataLineage\CaptureDataLineage.dtsx", _
      Nothing)
    Dim pkgVars As Variables = pkg.Variables
    Dim myVar As Variable = pkg.Variables.Add("myCustomVar", False, "User", "3")
    Dim pkgVar As Variable
    For Each pkgVar In pkgVars
      Console.WriteLine("Variable: {0}, {1}, {2}", pkgVar.Name, _
        pkgVar.DataType, pkgVar.Value.ToString())
    Next
    Console.Read()

  End Sub

End Module

範例輸出:

Variable: CancelEvent, Int32, 0

Variable: CreationDate, DateTime, 4/18/2003 11:57:00 AM

Variable: CreatorComputerName, String,

Variable: CreatorName, String,

Variable: ExecutionInstanceGUID, String, {237AB5A4-7E59-4FC9-8D61-E8F20363DF25}

Variable: FileName, String, Junk

Variable: InteractiveMode, Boolean, False

Variable: LocaleID, Int32, 1033

Variable: MachineName, String, MYCOMPUTERNAME

Variable: myCustomVar, String, 3

Variable: OfflineMode, Boolean, False

Variable: PackageID, String, {F0D2E396-A6A5-42AE-9467-04CE946A810C}

Variable: PackageName, String, DTSPackage1

Variable: StartTime, DateTime, 1/28/2005 7:55:39 AM

Variable: UserName, String, <domain>\<userid>

Variable: VersionBuild, Int32, 198

Variable: VersionComments, String,

Variable: VersionGUID, String, {90E105B4-B4AF-4263-9CBD-C2050C2D6148}

Variable: VersionMajor, Int32, 1

Variable: VersionMinor, Int32, 0

請注意,在系統命名空間中限定範圍的所有變數,都可供套件使用。 如需詳細資訊,請參閱 系統變數

命名空間

Microsoft SQL Server Integration Services (SSIS) 提供變數所在的兩個預設命名空間: 使用者系統 命名空間。 根據預設,開發人員建立的任何自訂變數都會新增至使用者命名空間。 系統變數位於系統命名空間中。 您可以建立使用者命名空間之外的其他命名空間,以儲存自訂變數,而且可以變更使用者命名空間的名稱,但是無法在系統命名空間中新增或修改變數,也無法將系統變數指派給不同的命名空間。

可使用的系統變數會因容器類型而異。 如需可用於套件、容器、工作和事件處理常式的系統變數清單,請參閱系統變數

自訂變數值可以是常值或是運算式:

  • 如果您希望變數包含常值,請設定其 Value 屬性值。

  • 如果您想要讓變數包含表示式,以便使用運算式的結果作為其值,請將變數true的屬性設定EvaluateAsExpression為,並在屬性中Expression提供表達式。 在執行階段會評估運算式,而且運算式的結果會做為變數值。 例如,如果變數的運算式屬性是 "100 * 2""100 * 2",則變數會將值評估為 200。

對於變數,您無法明確地設定其 DataType 的值。 DataType 值是從指派給變數的初始值來推斷,而且之後不能變更。 如需變數資料類型的詳細資訊,請參閱整合服務資料類型

下列程式代碼範例會建立新的變數,並將 設定 EvaluateAsExpressiontrue,將表達式指派給變數的 expression "100 * 2" 屬性,然後輸出變數的值。

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

namespace Microsoft.SqlServer.Dts.Samples
{
  class Program
  {
    static void Main(string[] args)
    {
      Package pkg = new Package();
      Variable v100 = pkg.Variables.Add("myVar", false, "", 1);
      v100.EvaluateAsExpression = true;
      v100.Expression = "100 * 2";
      Console.WriteLine("Expression for myVar: {0}", 
        v100.Properties["Expression"].GetValue(v100));
      Console.WriteLine("Value of myVar: {0}", v100.Value.ToString());
      Console.Read();
    }
  }
}
Imports Microsoft.SqlServer.Dts.Runtime

Module Module1

  Sub Main()

    Dim pkg As Package = New Package
    Dim v100 As Variable = pkg.Variables.Add("myVar", False, "", 1)
    v100.EvaluateAsExpression = True
    v100.Expression = "100 * 2"
    Console.WriteLine("Expression for myVar: {0}", _
      v100.Properties("Expression").GetValue(v100))
    Console.WriteLine("Value of myVar: {0}", v100.Value.ToString)
    Console.Read()

  End Sub

End Module

範例輸出:

Expression for myVar: 100 * 2

Value of myVar: 200

運算式必須是使用 SSIS 運算式語法的有效運算式。 除了運算式語法提供的運算子與函數之外,變數運算式中還允許常值,但是運算式無法參考其他變數或是資料行。 如需詳細資訊,請參閱 Integration Services (SSIS) 運算式

組態檔

如果組態檔包含自訂變數,則可以在執行階段更新變數。 這表示當封裝執行時,會使用組態檔中的新值來取代原本在封裝中的變數值。 當將封裝部署到需要不同變數值的多部伺服器時,這個取代技術將特別有用。 例如,變數可以指定 Foreach 迴圈容器重複其工作流程的次數;或是列出事件處理常式在引發錯誤時,傳送電子郵件的收件者清單;或是變更套件失敗前,允許發生的錯誤次數。 這些變數是在每個環境的組態檔中動態提供的。 因此,在組態檔中只允許讀取/寫入的變數。 如需詳細資訊,請參閱 建立封裝組態

Integration Services 圖示 (小型) 使用 Integration Services 保持最新狀態
如需來自Microsoft的最新下載、文章、範例和影片,以及來自社群的所選解決方案,請流覽 MSDN 上的 Integration Services 頁面:

流覽 MSDN 上的 Integration Services 頁面

如需這些更新的自動通知,請訂閱頁面上可用的 RSS 摘要。

另請參閱

Integration Services (SSIS) 變數在套件中使用變數