SSIS ForEach循环中的变量映射

时间:2015-03-23 20:59:58

标签: ssis ssis-2008

我正在使用存储过程填充SSIS 2008中的ado net数据集。结果集包含21列。当在SSIS中使用For Each循环时,似乎如果我想要前两列,那么第20列我不能使用索引0,1,19。看来我必须使用2-18的create mappings我想使用索引19.有没有办法只使用你想要的字段?

提前致谢。

1 个答案:

答案 0 :(得分:3)

工作正常,我不确定你遇到了什么。

classic off by one, great job me

我创建了一个基本包,其中包含一个执行SQL任务,并将其输入到Foreach循环容器中。

我的源代码查询很丑,但它满足了我的懒惰

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;

我将完整的结果集推送到一个名为rsResults的类型为Object的SSIS变量。

在我的Foreach循环容器中,我将变量Col00Col01Col19映射到顺序位置0,1和19

enter image description here

Biml所有的东西

如果您拥有Visual Studio的免费插件BIDS Helper,只需点击几下即可重新创建我的解决方案。 Biml是商业智能标记语言,将其视为BI的操作系统。在这里,我们将使用一些XML来描述我们想要的SSIS包。

  1. 将新的.biml文件添加到您的SSIS项目
  2. 将第三行修复为指向有效数据库
  3. 右键单击biml文件并选择“生成SSIS包”
  4. 利润
  5. <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>