我有一个SSIS包,我需要从ADO NET Source获取包最后运行的日期,然后将其分配给变量,以便我可以在另一个ADO NET Source的查询中使用它。我无法在谷歌上找到一个实际有用的例子。我正在运行VS 2012并连接到SQL Server 2012实例。如果需要更多信息,请告诉我。
答案 0 :(得分:4)
@User::LastRanDate
。ConnectionType
属性设置为 ADO.NET 。Connection
属性设置为ADO.NET连接。SQLStatement
属性设置为将返回所需日期的语句。确保返回的第一列是日期。ResultSet
属性设置为单行。Result Name
值设置为 0 ,将Variable Name
值设置为 @User :: LastRanDate 。 (ADO.NET结果集作为索引数组返回。) 完成任务后,@ User :: LastRanDate现在将被设置为返回的查询,您可以使用它来为您的其他ADO.NET源构建查询。
答案 1 :(得分:2)
在SSIS中使用ADO.NET数据源中的参数化查询并不像OLE DB那样容易。基本上,你将不得不用表达式语言编写查询,并祈祷你的源代码不适合sql注入。
我创建了一个包含3个变量的包,如下所示
我将LastRunDate作为DateTime,将QueryAdo作为字符串。这被评估为表达式为"SELECT RD.* FROM dbo.RunData AS RD WHERE RD.InsertDate > '" + (DT_WSTR, 25) @[User::LastRunDate] + "';"
我创建了一个使用查询的Execute sql任务,并设置为返回单行。我将此值分配给我的SSIS变量。
在我的结果标签中,我将零点列分配给我的变量LastRunDate
注意这里有一个表达式。在ADO.NET源代码中,我最初使用SELECT RD.* FROM dbo.RunData AS RD
来获取元数据集。
在我对数据流感到满意之后,我转到控制流程并将我的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>