Программная работа с переменными
С помощью переменных можно динамически задавать значения и управлять процессами в пакетах, контейнерах, задачах и обработчиках событий. Переменные могут также использоваться элементами управления очередностью для управления направлением потока данных к различным задачам. С помощью переменных можно:
Обновлять свойства пакета во время выполнения.
Заполнять значения параметров инструкций Transact-SQL во время выполнения.
Управлять потоком цикла по каждому элементу. Дополнительные сведения см. в разделе Добавление перечисления к потоку управления.
Управлять управлением очередностью, используя его в выражении. Управление очередностью может содержать переменные в определении ограничения. Дополнительные сведения см. в разделе Добавление выражений к объектам управления очередностью.
Управлять условным повторением контейнера «цикл по элементам». Дополнительные сведения см. в разделе Добавление итерации к потоку управления.
Строить выражения, содержащие значения переменных.
Пользовательские переменные можно создавать для всех типов контейнеров: пакетов, контейнеров типа «цикл по элементам», «цикл по каждому элементу», «последовательность», серверов задач и обработчиков событий. Дополнительные сведения см. в разделах Переменные служб Integration Services и Использование переменных в пакетах.
Параметр 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, доступны для пакета. Дополнительные сведения см. в разделе Системные переменные.
Пространства имен
Службы MicrosoftSQL ServerIntegration 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.
Файлы конфигурации
Если в файле конфигурации содержится пользовательская переменная, эта переменная может быть обновлена во время выполнения. Это означает, что при выполнении пакета значение переменной, содержавшееся в пакете изначально, заменяется новым значением из файла конфигурации. Такой способ замены оказывается полезным, когда пакет развертывается на нескольких серверах, где требуются разные значения переменной. Например, переменная может содержать число повторений потока операций контейнера «цикл по каждому элементу», список получателей, которым обработчик событий направляет сообщения электронной почты при возникновении ошибки, либо измененное максимально допустимое число ошибок перед завершением выполнения пакета с ошибкой. Эти переменные динамически передаются в файлах конфигурации для каждой среды. По этой причине в файлах конфигурации допускается использование только переменных, доступных для чтения и записи. Дополнительные сведения см. в разделе Создание конфигураций пакетов.
|
См. также