SSIS Количество объектов Переменная? - PullRequest
3 голосов
/ 16 декабря 2011

Я использую SSIS в BIDS 2008 и пытаюсь получить число переменных объекта, содержащих список файлов. Есть идеи, как это сделать?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 17 декабря 2011

Как вы заполняете эту переменную объекта? В зависимости от того, как вы заполнили переменную, могут быть перечислены более подходящие способы получения количества. Тем не менее, вот быстрое и грязное решение для вас:

  1. Создайте новую переменную типа integer и инициализируйте переменную 0
  2. Используйте задачу цикла foreach для итерации по вашему объекту (откройте редактор цикла foreach, перейдите на Collections и измените Enumerator на Foreach ADO Enumerator, а переменную источника объекта ADO на переменную Object.
  3. Создать Execute SQL Task
  4. На вкладке "Общие" установите ResultSet в "Одну строку", а в своем выражении SQL - SELECT (@Count + 1)
  5. На вкладке «Сопоставление параметров» добавьте новую целочисленную переменную и измените атрибут Parameter Name на @ Count
  6. На вкладке «Набор результатов» добавьте новую запись с именем: 0 и именем переменной: вновь созданная целочисленная переменная.

Когда цикл завершится, у вас будет счетчик объекта.

ПРИМЕЧАНИЕ. Если вы уже просматриваете эти файлы (как я полагаю, поскольку вы используете SSIS для заполнения объектной переменной именами файлов), вам нужно выполнить только шаги 1, 3-6.

1 голос
/ 17 декабря 2011

Есть ли причина, по которой вы не просто используете задачу скрипта?

Учитывая две переменные служб 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 просто присваивает значение переменной SSIS 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 или привести их к типу, пока вы не найдете что-то время может преобразовать в строго типизированный объект.

...