Поделиться через


Программная работа с переменными

С помощью переменных можно динамически задавать значения и управлять процессами в пакетах, контейнерах, задачах и обработчиках событий. Переменные могут также использоваться элементами управления очередностью для управления направлением потока данных к различным задачам. С помощью переменных можно:

Параметр Scope

Каждый контейнер имеет собственную коллекцию 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

Вывод образца:

Переменная: CancelEvent, Int32, 0

Переменная: CreationDate, DateTime, 4/18/2003 11:57:00 AM

Переменная: CreatorComputerName, String

Переменная: CreatorName, String

Переменная: ExecutionInstanceGUID, String, {237AB5A4-7E59-4FC9-8D61-E8F20363DF25}

Переменная: FileName, String, Junk

Переменная: InteractiveMode, Boolean, False

Переменная: LocaleID, Int32, 1033

Переменная: MachineName, String, MYCOMPUTERNAME

Переменная: myCustomVar, String, 3

Переменная: OfflineMode, Boolean, False

Переменная: PackageID, String, {F0D2E396-A6A5-42AE-9467-04CE946A810C}

Переменная: PackageName, String, DTSPackage1

Переменная: StartTime, DateTime, 1/28/2005 7:55:39 AM

Переменная: UserName, String, <domain>\<userid>

Переменная: VersionBuild, Int32, 198

Переменная: VersionComments, String,

Переменная: VersionGUID, String, {90E105B4-B4AF-4263-9CBD-C2050C2D6148}

Переменная: VersionMajor, Int32, 1

Переменная: VersionMinor, Int32, 0

Обратите внимание, что все переменные, определенные в области пространства имен System, доступны для пакета. Дополнительные сведения см. в разделе Системные переменные.

Пространства имен

Службы Microsoft SQL Server Integration Services (SSIS) предоставляют два пространства имен по умолчанию, в которых располагаются переменные, – User и System. По умолчанию любая пользовательская переменная, созданная разработчиком, добавляется в пространство имен User. Системные переменные располагаются в пространстве имен System. Можно создавать дополнительные пространства имен, отличные от User, для размещения пользовательских переменных. Также можно изменить имя пространства имен User. В то же время, нельзя добавить или изменить переменные в пространстве имен System или назначить системные переменные другому пространству имен.

Доступность системных переменных определяется типом контейнера. Список системных переменных, доступных для пакетов, контейнеров, задач и обработчиков событий, см. в разделе Системные переменные.

Значение

Значением пользовательской переменной может быть строка или выражение.

  • Если необходимо задать для переменной литеральное значение, укажите значение ее свойства Value.

  • Если необходимо, чтобы переменная содержала выражение, результаты которого использовались бы в качестве ее значения, присвойте свойству EvaluateAsExpression переменной значение true и предоставьте выражение в свойстве Expression. Во время выполнения выражение вычисляется, и его результат используется в качестве значения переменной. Например, если свойство выражения переменной имеет вид "100 * 2""100 * 2", в результате вычисления переменная получает значение 200.

Для переменной нельзя явно задать значение DataType. Значение DataType выводится из исходного значения, присвоенного переменной, и в дальнейшем не может быть изменено. Дополнительные сведения о типах данных переменных см. в разделе Типы данных служб Integration Services.

В следующем примере кода создается новая переменная, свойству EvaluateAsExpression присваивается значение true, выражение "100 * 2" назначается в качестве значения свойства Expression переменной, а затем выводится значение переменной.

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

Вывод образца:

Выражение для переменной myVar: 100 * 2

Значение переменной myVar: 200

Выражение должно быть действительным выражением, использующим синтаксис выражений служб SSIS. Литералы допускаются в выражениях переменных, в дополнение к операторам и функциям, которые предоставляются синтаксисом выражений, однако выражения не могут ссылаться на другие переменные или столбцы. Дополнительные сведения см. в разделе Справочник по выражениям служб Integration Services.

Файлы конфигурации

Если в файле конфигурации содержится пользовательская переменная, эта переменная может быть обновлена во время выполнения. Это означает, что при выполнении пакета значение переменной, содержавшееся в пакете изначально, заменяется новым значением из файла конфигурации. Такой способ замены оказывается полезным, когда пакет развертывается на нескольких серверах, где требуются разные значения переменной. Например, переменная может содержать число повторений рабочего процесса контейнера «цикл по каждому элементу», список получателей, которым обработчик событий направляет сообщения электронной почты при возникновении ошибки, либо измененное максимально допустимое число ошибок перед завершением выполнения пакета с ошибкой. Эти переменные динамически передаются в файлах конфигурации для каждой среды. По этой причине в файлах конфигурации допускается использование только переменных, доступных для чтения и записи. Дополнительные сведения см. в разделе Создание конфигураций пакетов.

Значок служб Integration Services (маленький) Будьте в курсе новых возможностей cлужб Integration Services

Чтобы загружать новейшую документацию, статьи, образцы и видеоматериалы от корпорации Майкрософт, а также лучшие решения от участников сообщества, посетите страницу служб Integration Services на сайте MSDN или TechNet:

Чтобы получать автоматические уведомления об этих обновлениях, подпишитесь на RSS-каналы, предлагаемые на этой странице.