Сопоставление переменных в цикле ForEach служб SSIS

Я заполняю набор данных ado net в SSIS 2008 хранимой процедурой. Набор результатов содержит 21 столбец. При использовании цикла For Each в SSIS кажется, что если мне нужны первые два столбца, то 20-й столбец я не могу использовать с индексами 0,1, 19. Похоже, мне нужно использовать создание сопоставлений для 2-18, если я хочу использовать индекс 19. Есть ли способ использовать только те поля, которые вы хотите?

Заранее спасибо.


person Community    schedule 23.03.2015    source источник
comment
Почему вы не используете хранимую процедуру на основе набора, которая возвращает только те столбцы, которые вам нужны? Повторное использование кода — это плохо, когда код не совсем то, что вам нужно.   -  person HLGEM    schedule 24.03.2015


Ответы (1)


Работает нормально, я не уверен, с чем вы столкнулись.

классика выключена на один, отличная работа, я

Я создал базовый пакет с задачей «Выполнение SQL», загружаемой в контейнер цикла по каждому элементу.

Мой исходный запрос уродлив, но он удовлетворяет мою лень

SELECT 
*
FROM
(
    SELECT TOP 21
        CAST(ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS int) AS rn
    FROM    
        sys.all_columns AS AC
) D
PIVOT
(
    max(rn)
    FOR rn IN ([1]
,   [2]
,   [3]
,   [4]
,   [5]
,   [6]
,   [7]
,   [8]
,   [9]
,   [10]
,   [11]
,   [12]
,   [13]
,   [14]
,   [15]
,   [16]
,   [17]
,   [18]
,   [19]
,   [20]
,   [21]
)
) P;

Я помещаю этот полный набор результатов в переменную SSIS с именем rsResults типа Object.

В моем контейнере цикла по каждому элементу я сопоставляю переменные Col00, Col01 и Col19 с порядковыми позициями 0, 1 и 19.

введите здесь описание изображения

Бимл все вещи

Если у вас есть бесплатное дополнение к Visual Studio, BIDS Helper, вы можете воссоздать мое решение несколькими щелчками мыши. Biml — это язык разметки бизнес-аналитики, думайте о нем как об операционной системе для BI. Здесь мы будем использовать некоторый XML для описания пакета SSIS, который нам нужен.

  1. Добавьте новый файл .biml в свой проект SSIS.
  2. Исправьте третью строку, чтобы она указывала на действующую базу данных.
  3. Щелкните правой кнопкой мыши файл biml и выберите «Создать пакет SSIS».
  4. Выгода
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Connections>
        <!-- UPDATE ME -->
        <OleDbConnection Name="CM_OLE" ConnectionString="Data Source=localhost\dev2014;Initial Catalog=tempdb;Provider=SQLNCLI10.1;Integrated Security=SSPI;Auto Translate=False;" />
    </Connections>
    <Packages>
        <Package ConstraintMode="Linear" Name="so_29220275">
            <Variables>
                <Variable DataType="Object" Name="rsResults" />
                <Variable DataType="Int32" Name="Col00">-1</Variable>
                <Variable DataType="Int32" Name="Col01">-1</Variable>
                <Variable DataType="Int32" Name="Col19">-1</Variable>
                <Variable DataType="String" Name="QuerySource"><![CDATA[SELECT 
*
FROM
(
    SELECT TOP 21
        CAST(ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS int) AS rn
    FROM    
        sys.all_columns AS AC
) D
PIVOT
(
    max(rn)
    FOR rn IN ([1]
,   [2]
,   [3]
,   [4]
,   [5]
,   [6]
,   [7]
,   [8]
,   [9]
,   [10]
,   [11]
,   [12]
,   [13]
,   [14]
,   [15]
,   [16]
,   [17]
,   [18]
,   [19]
,   [20]
,   [21]
)
) P;
]]></Variable>
            </Variables>
            <Tasks>
                <ExecuteSQL ConnectionName="CM_OLE" Name="SQL - gen data" ResultSet="Full">
                    <VariableInput VariableName="User.QuerySource" />
                    <Results>
                        <Result VariableName="User.rsResults" Name="0"></Result>
                    </Results>
                </ExecuteSQL>
                <ForEachAdoLoop SourceVariableName="User.rsResults" ConstraintMode="Linear" Name="FELC 3 of 20">
                    <VariableMappings>
                        <VariableMapping VariableName="User.Col00" Name="0" />
                        <VariableMapping VariableName="User.Col01" Name="1" />
                        <VariableMapping VariableName="User.Col19" Name="19" />
                    </VariableMappings>
                    <Tasks>
                        <ExecuteSQL ConnectionName="CM_OLE" Name="SQL - do nothing">
                            <DirectInput>SELECT 1;</DirectInput>
                        </ExecuteSQL>
                    </Tasks>
                </ForEachAdoLoop>
            </Tasks>
        </Package>
    </Packages>
</Biml>
person billinkc    schedule 23.03.2015
comment
Большое спасибо за твою помощь. Я смог увидеть свою проблему и исправить ее. - person ; 24.03.2015
comment
@Rich круто, рад слышать. Если не против поделиться, что у вас не так? Я неофициально пытаюсь собрать анекдоты о том, где у людей возникают проблемы в стране SSIS. - person billinkc; 24.03.2015
comment
У меня был неправильный тип данных в переменной 3, и я подумал, что, поскольку у меня есть переменные для индексов 0, 1, 3, 4, ошибка была из-за того, что я пропустил 2. - person ; 24.03.2015