在SSIS中动态地为变量赋值

时间:2014-08-04 19:11:07

标签: ssis

我有一个SSIS包,我需要从ADO NET Source获取包最后运行的日期,然后将其分配给变量,以便我可以在另一个ADO NET Source的查询中使用它。我无法在谷歌上找到一个实际有用的例子。我正在运行VS 2012并连接到SQL Server 2012实例。如果需要更多信息,请告诉我。

2 个答案:

答案 0 :(得分:4)

  1. 创建变量@User::LastRanDate
  2. 创建执行SQL任务。
  3. ConnectionType属性设置为 ADO.NET
  4. Connection属性设置为ADO.NET连接。
  5. SQLStatement属性设置为将返回所需日期的语句。确保返回的第一列是日期。
  6. ResultSet属性设置为单行
  7. 在任务编辑器的结果集选项卡上,点击添加并将Result Name值设置为 0 ,将Variable Name值设置为 @User :: LastRanDate (ADO.NET结果集作为索引数组返回。)
  8. 完成任务后,@ User :: LastRanDate现在将被设置为返回的查询,您可以使用它来为您的其他ADO.NET源构建查询。

答案 1 :(得分:2)

在SSIS中使用ADO.NET数据源中的参数化查询并不像OLE DB那样容易。基本上,你将不得不用表达式语言编写查询,并祈祷你的源代码不适合sql注入。

我创建了一个包含3个变量的包,如下所示

封装

enter image description here

变量

我将LastRunDate作为DateTime,将QueryAdo作为字符串。这被评估为表达式为"SELECT RD.* FROM dbo.RunData AS RD WHERE RD.InsertDate > '" + (DT_WSTR, 25) @[User::LastRunDate] + "';"

的表达式

enter image description here

执行SQL任务

我创建了一个使用查询的Execute sql任务,并设置为返回单行。我将此值分配给我的SSIS变量。

enter image description here

在我的结果标签中,我将零点列分配给我的变量LastRunDate

enter image description here

数据流

注意这里有一个表达式。在ADO.NET源代码中,我最初使用SELECT RD.* FROM dbo.RunData AS RD来获取元数据集。

enter image description here

在我对数据流感到满意之后,我转到控制流程并将我的Query变量替换为ADO.NET Source组件中的表达式(参见引用的问题)。

试一试,尝试一下,你会看到

我使用以下脚本构建我的演示环境

create table dbo.RussJohnson
(
    LastRunDate datetime NOT NULL
);


create table dbo.RunData
(
    SomeValue int NOT NULL
,   InsertDate datetime NOT NULL
);


insert into dbo.RussJohnson
SELECT '2014-08-01' AS LastRunDate

INSERT INTO
    dbo.RunData
(
    SomeValue
,   InsertDate
)
SELECT
    D.rc AS Somevalue
,   dateadd(d, D.rc, '2014-07-30') AS InsertDate
FROM
(
    SELECT TOP 15 ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rc
    FROM sys.all_columns AS SC
) D;

由于我安装了BIDS Helper,因此我使用以下Biml来生成此包。对于那些在家里玩的人,您需要编辑第三行,以便ADO.NET连接管理器指向有效的服务器和数据库。

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Connections>
        <AdoNetConnection Name="CM_ADO_DB" ConnectionString="Data Source=localhost\dev2014;Integrated Security=SSPI;Connect Timeout=30;Database=tempdb;" Provider="SQL"  />
    </Connections>
    <Packages>
        <Package Name="so_25125838" ConstraintMode="Linear">
            <Variables>
                <Variable DataType="DateTime" Name="LastRunDate" >2014-01-01</Variable>
                <Variable DataType="Int32" Name="RowCountOriginal" >0</Variable>
                <Variable DataType="String" Name="QueryAdo" EvaluateAsExpression="true">"SELECT RD.* FROM dbo.RunData AS RD WHERE RD.InsertDate > '" + (DT_WSTR, 25) @[User::LastRunDate] + "';"</Variable>
            </Variables>
            <Tasks>
                <ExecuteSQL 
                    Name="SQL GetLastRunDate" 
                    ConnectionName="CM_ADO_DB"
                    ResultSet="SingleRow"
                    >
                    <DirectInput>SELECT MAX(RJ.LastRunDate) AS LastRunDate FROM dbo.RussJohnson AS RJ;</DirectInput>
                    <Results>
                        <Result Name="0" VariableName="User.LastRunDate" />
                    </Results>
                </ExecuteSQL>
                <Dataflow Name="DFT POC">
                    <Transformations>
                        <AdoNetSource Name="ADO_SRC Get New Data" ConnectionName="CM_ADO_DB">
                            <DirectInput>SELECT RD.* FROM dbo.RunData AS RD</DirectInput>
                        </AdoNetSource>
                        <RowCount Name="CNT Original rows" VariableName="User.RowCountOriginal" />
                    </Transformations>
                    <Expressions>
                        <Expression ExternalProperty="[ADO_SRC Get New Data].[SqlCommand]">@[User::QueryAdo]</Expression>
                    </Expressions>
                </Dataflow>
            </Tasks>
        </Package>
    </Packages>
</Biml>