SSIS Количество объектов Переменная?

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

Спасибо!

3 ответа

Решение

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

  1. Создайте новую переменную типа integer и инициализируйте переменную в 0
  2. Используйте задачу цикла foreach для итерации вашего объекта (откройте редактор цикла foreach, перейдите к Collections и измените перечислитель на 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.

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

Для двух переменных служб 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.

  1. Создана переменная счетчика с DataType=INT Value=1
  2. Перетащите задачу выражения ниже моего потока данных и прикрепите приоритет
  3. Вставил эту функцию в задачу выражения
      @[User::Count] = @[User::Count] + 1

Каждый раз, когда файл зацикливается, переменная Count увеличивается на 1. Надеюсь, это поможет любому, кто ищет этот вопрос.

Другие вопросы по тегам