프로그래밍 방식으로 변수 사용Working with Variables Programmatically

변수는 패키지, 컨테이너, 태스크 및 이벤트 처리기에서 동적으로 값을 설정하고 프로세스를 제어하는 데 사용됩니다.Variables are a way to dynamically set values and control processes in packages, containers, tasks, and event handlers. 선행 제약 조건에서 변수를 사용하여 다른 태스크로의 데이터 흐름 방향을 제어할 수도 있습니다.Variables can also be used by precedence constraints to control the direction of the flow of data to different tasks. 다음과 같은 다양한 용도로 변수를 사용할 수 있습니다.Variables have a variety of uses:

  • 런타임에 패키지의 속성을 업데이트합니다.Update properties of a package at run time.

  • 런타임에 Transact-SQL 문의 매개 변수 값을 채웁니다.Populate parameter values for Transact-SQL statements at run time.

  • Foreach 루프의 흐름을 제어합니다.Control the flow of a Foreach loop. 자세한 내용은 참조 제어 흐름에 열거 추가합니다.For more information, see Add Enumeration to a Control Flow.

  • 선행 제약 조건의 식에 사용하여 선행 제약 조건을 제어합니다.Control a precedence constraint by its use in an expression. 선행 제약 조건의 제약 조건 정의에는 변수가 포함될 수 있습니다.A precedence constraint can include variables in the constraint definition. 자세한 내용은 선행 제약 조건에 식 추가를 참조하세요.For more information, see Add Expressions to Precedence Constraints.

  • For 루프 컨테이너의 조건부 반복을 제어합니다.Control the conditional repeat of a For Loop container. 자세한 내용은 참조 제어 흐름에 반복 추가합니다.For more information, see Add Iteration to a Control Flow.

  • 변수 값이 포함된 식을 작성합니다.Build expressions that include variable values.

  • 모든 컨테이너 유형에 대해 사용자 지정 변수를 만들 수 있습니다: 패키지, Foreach 루프 컨테이너 For 루프 컨테이너 시퀀스 컨테이너, Taskhost 및 이벤트 처리기입니다.You can create custom variables for all container types: packages, Foreach Loop containers, For Loop containers, Sequence containers, TaskHosts, and event handlers. 자세한 내용은 Integration Services(SSIS) 변수패키지에서 변수 사용을 참조하세요.For more information, see Integration Services (SSIS) Variables and Use Variables in Packages.

범위Scope

각 컨테이너에는 고유한 Variables 컬렉션이 있습니다.Each container has its own Variables collection. 새 변수를 만들면 해당 변수는 부모 컨테이너의 범위 내에서 작동합니다.When a new variable is created, it is within the scope of its parent container. 패키지 컨테이너는 컨테이너 계층 구조의 최상위에 있으므로 패키지 범위의 변수는 전역 변수와 같은 기능을 수행하며 해당 패키지 내의 모든 컨테이너에 표시됩니다.Because the package container is at the top of the container hierarchy, variables with package scope function like global variables, and are visible to all containers within the package. 또한 컨테이너의 자식 컨테이너에서는 변수 이름이나 컬렉션에서의 변수 인덱스를 사용하여 Variables 컬렉션을 통해 컨테이너의 변수 컬렉션에 액세스할 수 있습니다.The collection of variables for the container can also be accessed by the children of the container through the Variables collection, by using either the variable name or the variable's index in the collection.

변수의 표시 범위는 하향식으로 결정되므로 패키지 수준에서 선언된 변수는 해당 패키지의 모든 컨테이너에 표시됩니다.Because the visibility of a variable is scoped from the top down, variables declared at the package level are visible to all the containers in the package. 따라서 컨테이너의 Variables 컬렉션에는 해당 컨테이너의 변수뿐 아니라 부모 컨테이너에 속하는 모든 변수가 포함됩니다.Therefore, the Variables collection on a container includes all the variables that belong to its parent in addition to its own variables

반면, 태스크에 포함된 변수는 범위 및 표시 여부가 제한적이므로 해당 태스크에만 표시됩니다.Conversely, the variables that are contained in a task are limited in scope and visibility, and are only visible to the task.

패키지에서 다른 패키지를 실행할 경우 호출하는 패키지의 범위에 정의된 변수를 호출되는 패키지에서 사용할 수 있습니다.If a package runs other packages, the variables defined in the scope of the calling package are available to the called package. 단, 같은 이름의 변수가 호출되는 패키지에도 있는 경우는 예외입니다.The only exception occurs when a same-named variable exists in the called package. 이러한 충돌이 발생할 경우에는 호출되는 패키지의 변수 값이 호출하는 패키지의 값보다 우선합니다.When this collision occurs, the variable value in the called package overrides the value from the calling package. 반대로 호출되는 패키지의 범위에 정의된 변수를 호출하는 패키지에서 사용할 수는 없습니다.Variables defined in the scope of the called package are never available back to the calling package.

다음 코드 예에서는 패키지 범위에서 프로그래밍 방식으로 myCustomVar 변수를 만든 다음 해당 패키지에 표시된 모든 변수를 반복하여 각 변수의 이름, 데이터 형식 및 값을 출력합니다.The following code example programmatically creates a variable, myCustomVar, at the package scope, and then iterates through all the variables visible to the package, printing their name, data type, and value.

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  

샘플 출력:Sample Output:

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

모든 변수 범위는 시스템 네임 스페이스는 패키지에 사용할 수 있습니다.Notice that all the variables scoped in the System namespace are available to the package. 자세한 내용은 System Variables을 참조하세요.For more information, see System Variables.

네임스페이스Namespaces

MicrosoftMicrosoft SQL ServerSQL Server Integration ServicesIntegration Services ( SSISSSIS); 변수 상주 하는 두 개의 기본 네임 스페이스를 제공 합니다. 사용자시스템 네임 스페이스입니다. SQL ServerSQL Server Integration ServicesIntegration Services ( SSISSSIS) provides two default namespaces where variables reside; User and System namespaces. 기본적으로 개발자가 만든 모든 사용자 지정 변수를 추가 사용자 네임 스페이스입니다.By default, any custom variable created by the developer is added to the User namespace. 에 있는 시스템 변수는 시스템 네임 스페이스입니다.System variables reside in the System namespace. 이외의 다른 네임 스페이스를 추가로 만들 수 있습니다는 사용자 있습니다 및 사용자 지정 변수를 저장 하는 네임 스페이스의 이름을 변경할 수는 사용자 수 있지만 네임 스페이스를 추가 하거나에서 변수를 수정는 시스템 네임 스페이스 또는 시스템 변수를 다른 네임 스페이스에 할당 합니다.You can create additional namespaces other than the User namespace to hold custom variables, and you can change the name of the User namespace, but you cannot add or modify variables in the System namespace, or assign system variables to a different namespace.

사용할 수 있는 시스템 변수는 컨테이너 유형에 따라 달라집니다.The system variables that are available differ depending on the container type. 패키지, 컨테이너, 태스크 및 이벤트 처리기를 사용할 수 있는 시스템 변수 목록은 참조 시스템 변수합니다.For a list of the system variables available to packages, containers, tasks, and event handlers, see System Variables.

ValueValue

사용자 지정 변수의 값은 리터럴 또는 식일 수 있습니다.The value of a custom variable can be a literal or an expression:

  • 변수에 리터럴 값을 포함하려면 변수의 Value 속성 값을 설정합니다.If you want the variable to contain a literal value, set the value of its Value property.

  • 해당 값으로 식의 결과 사용할 수 있도록 하는 식을 포함 하면 변수를 원하는 경우 설정의 EvaluateAsExpression 변수의 속성 true에 식을 제공 하 고는 Expression 속성입니다.If you want the variable to contain an expression, so that you can use the results of the expression as its value, set the EvaluateAsExpression property of the variable to true, and provide an expression in the Expression property. 런타임에는 이 식이 계산되고 식 결과가 변수 값으로 사용됩니다.At run time, the expression is evaluated, and the result of the expression is used as the value of the variable. 예를 들어 변수의 식 속성이 "100 * 2""100 * 2"이면 이 변수는 값 200으로 계산됩니다.For example, if the expression property of a variable is "100 * 2""100 * 2", the variable evaluates to a value of 200.

    변수의 경우에는 DataType 값을 명시적으로 설정할 수 없습니다.For a variable, you cannot explicitly set the value of its DataType. DataType 값은 변수에 할당된 초기 값에서 유추되며 이후에는 변경할 수 없습니다.The DataType value is inferred from the initial value assigned to the variable, and cannot be changed afterward. 변수 데이터 형식에 대 한 자세한 내용은 참조 Integration Services Data Types합니다.For more information about variable data types, see Integration Services Data Types.

    다음 코드 예제에서는 새 변수 집합을 만듭니다 EvaluateAsExpressiontrue, 식을 할당 "100 * 2" 들어 변수의 식 속성에 변수 값을 출력 합니다.The following code example creates a new variable, sets EvaluateAsExpression to true, assigns the expression "100 * 2" to the expression property of the variable, and then outputs the value of the variable.

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  

샘플 출력:Sample Output:

Expression for myVar: 100 * 2

Value of myVar: 200

식은 SSISSSIS 식 구문을 사용하는 유효한 식이어야 합니다.The expression must be a valid expression that uses the SSISSSIS expression syntax. 변수 식에는 식 구문에서 제공하는 연산자와 함수뿐 아니라 리터럴도 사용할 수 있지만 식에서 다른 변수 또는 열을 참조할 수는 없습니다.Literals are permitted in variable expressions, in addition to the operators and functions that the expression syntax provides, but expressions cannot reference other variables or columns. 자세한 내용은 Integration Services(SSIS) 식가 될 때까지 워크플로를 반복합니다.For more information, see Integration Services (SSIS) Expressions.

구성 파일Configuration Files

구성 파일에 사용자 지정 변수가 포함된 경우 런타임에 해당 변수를 업데이트할 수 있습니다.If a configuration file includes a custom variable, the variable can be updated at run time. 즉, 패키지를 실행할 때 패키지의 원래 변수 값을 구성 파일의 새 값으로 바꿀 수 있습니다.What this means is that when the package runs, the value of the variable originally in the package is replaced with a new value from the configuration file. 이 기술은 패키지가 각기 다른 변수 값이 필요한 여러 서버에 배포된 경우에 유용합니다.This replacement technique is useful when a package is deployed to multiple servers that require different variable values. 예를 들어 변수 횟수를 지정할 수는 Foreach 루프 컨테이너가 반복 하는 워크플로, 또는 목록의 받는 사람 이벤트 처리기에서 보내는 오류가 발생 하는 경우 전자 메일을 또는 패키지가 실패 하기 전에 발생할 수 있는 오류 수를 변경 합니다.For example, a variable can specify the number of times a Foreach Loop container repeats its workflow, or list the recipients that an event handler sends e-mail to when an error is raised, or change the number of errors that can occur before the package fails. 이러한 변수는 각 환경의 구성 파일에서 동적으로 제공됩니다.These variables are dynamically provided in configuration files for each environment. 따라서 구성 파일에는 읽기/쓰기가 가능한 변수만 포함될 수 있습니다.Therefore, only variables that are read/write are allowed in configuration files. 자세한 내용은 패키지 구성 만들기를 참조하세요.For more information, see Create Package Configurations.

참고 항목See Also

Integration Services ( Ssis) 변수 Integration Services (SSIS) Variables
패키지에서 변수 사용Use Variables in Packages