SSIS Количество объектов Переменная?
Я использую SSIS в BIDS 2008 и пытаюсь получить число переменных объекта, содержащих список файлов. Есть идеи, как это сделать?
Спасибо!
3 ответа
Как вы заполняете эту переменную объекта? В зависимости от того, как вы заполнили переменную, могут быть перечислены более подходящие способы получения количества. Тем не менее, вот быстрое и грязное решение для вас:
- Создайте новую переменную типа integer и инициализируйте переменную в 0
- Используйте задачу цикла foreach для итерации вашего объекта (откройте редактор цикла foreach, перейдите к
Collections
и измените перечислитель наForeach ADO Enumerator
и переменная источника объекта ADO для вашей переменной Object. - Создать
Execute SQL Task
- На вкладке "Общие" установите ResultSet равным Одной строке, а ваш оператор SQL -
SELECT (@Count + 1)
- На вкладке "Сопоставление параметров" добавьте новую целочисленную переменную и измените
Parameter Name
приписать @Count - На вкладке "Набор результатов" добавьте новую запись с именем: 0 и именем переменной: вновь созданная целочисленная переменная.
Как только ваш цикл завершится, у вас будет счетчик объекта.
ПРИМЕЧАНИЕ. Если вы уже просматриваете эти файлы (как я полагаю, так как вы используете SSIS для заполнения объектной переменной именами файлов), вам нужно выполнить только шаги 1, 3-6.
Есть ли причина, по которой вы не просто используете сценарий?
Для двух переменных служб SSIS для MyObject (тип Object) и MyObjectCount (Int32) установлено значение 10.
Сценарий задачи 1 заполняет объект.
// Nothing clever, just fills a List<T> with
// MyObjectCount's worth of values.
public void Main()
{
int count = (Int32)Dts.Variables["User::MyObjectCount"].Value;
List<bool> obj = new List<bool>();
for (int i = 0; i < count; i++)
{
obj.Add(false);
}
Dts.Variables["User::MyObject"].Value = obj;
Dts.TaskResult = (int)ScriptResults.Success;
}
Задача 2 сценария просто назначает значение переменной SSO MyObject в локальную переменную, которую я преобразовал в соответствующий тип. Я сравниваю этот счет с моим счетчиком ссылок, и они совпадают.
public void Main()
{
int refCount = (Int32)Dts.Variables["User::MyObjectCount"].Value;
List<bool> obj = Dts.Variables["User::MyObject"].Value as List<bool>;
int actualCount = obj.Count;
string message = string.Format("Reference count: {0}. Actual count {1}", refCount, actualCount);
bool fireAgain = false;
Dts.Events.FireInformation(0, "Accessing count", message, string.Empty, 0, ref fireAgain);
Dts.TaskResult = (int)ScriptResults.Success; Dts.TaskResult = (int)ScriptResults.Success;
}
Результаты
[Доступ счетчика] Информация: Счетчик ссылок: 10. Фактический счетчик 10
Если вы не несете ответственности за то, что толкает объект в переменную SSIS, то вам может потребоваться заключить вышеприведенные извлечения в серию блоков try/catch или привести их как тип, пока вы не найдете то, что во время выполнения может преобразовать в строго типизированный объект.
Как я это делал, имейте в виду, что у меня уже был контейнер ForEachLoop, который зацикливался на файлах Excel.
- Создана переменная счетчика с DataType=INT Value=1
- Перетащите задачу выражения ниже моего потока данных и прикрепите приоритет
- Вставил эту функцию в задачу выражения
@[User::Count] = @[User::Count] + 1
Каждый раз, когда файл зацикливается, переменная Count увеличивается на 1. Надеюсь, это поможет любому, кто ищет этот вопрос.