如何在ADO.NET源SSIS中传递参数

时间:2013-11-20 10:29:19

标签: sql ssis

你好,我需要一些帮助这将是我的第一个SSIS包,我正在学习。到目前为止,这就是我所拥有的。

我创建了一个控制流程。然后我创建了三个ADO.Net连接,两个源和一个目标。然后我创建了数据流任务,它将数据从一个数据库中的表复制到同一服务器上另一个数据库中的相应表中。数据流任务有一个2 ADO NET Source和ADO NET Destination。目的地只是将字段映射到一起。

好的,到目前为止一切顺利。这是我的问题。某些源查询具有日期条件。一个例子是:

SELECT --Code Here 
WHERE CONVERT(varchar, call_date, 112) BETWEEN '6/1/2013' AND  '7/1/2013'

我想用变量替换这些硬编码日期。类似的东西:

WHERE CONVERT(varchar, call_date, 112) BETWEEN STARTDATE AND ENDATE

我已经阅读了几篇帖子,并尝试做了所描述的内容,但它没有下沉。所以请用我的例子告诉我如何做到这一点。如果我可以让我在运行它时提示我输入日期会很好,但我很高兴只是学习如何将变量传递给查询。

这是我所知道的唯一解决方案,因为我只是SSIS包中的初学者,希望有人能帮助我

4 个答案:

答案 0 :(得分:35)

由于这里的答案都没有实际回答问题(注意 ADO.NET源,而不是OLE DB!),这是真正的答案。

在SSIS中,您无法对ADO.NET源进行参数化。您必须使用解决方法。

幸运的是,解决方法很少。一个是创建脚本组件,其作用类似于源代码并对其进行编码。但是,人们不能轻易地将现有资源转换为脚本,尤其是当他缺乏ADO.NET编程知识时。

还有另一种解决方法,那就是在 ADO.NET Source采取行动之前创建SQL查询。但是,当您打开ADO.NET源时,您会注意到数据访问模式不允许变量输入。那么,你如何进行?

您希望动态设置ADO.NET源的SQL表达式,因此必须告诉数据流任务使用Expression配置SSIS ADO.NET源组件。

长话短说(或者说不那么短:),请执行以下操作:

    在您的包中
  • ,输入包含源/目标组件的数据流任务
  • 单击背景上的任意位置,以在“属性”面板中显示“任务”属性
  • 在“属性”面板中找到“表达式”属性,可以配置各种数据源/目标属性,并使用省略号按钮打开它(...)
  • 在Property下,选择源的SQL Command属性(例如[ADO.NET source]。[SqlCommand])添加一行
  • 点击行的省略号按钮以打开表达式生成器
  • 在Expression Builder中构建动态查询

对于date / datetime参数,最后一步可能有些麻烦。但是,这是一个例子,为了您的方便:

"SELECT * FROM YOUR_SOURCE_TABLE WHERE your_date_column = '" + 
  (DT_WSTR,4)YEAR(@[User::VAR_CONTAINING_DATE]) + "-" +
  (DT_WSTR,2)MONTH(@[User::VAR_CONTAINING_DATE]) + "-" +
  (DT_WSTR,2)DAY(@[User::VAR_CONTAINING_DATE]) + "'"

HTH

答案 1 :(得分:3)

[ADO.NET作为源类型解决方案]

第1步 为您要使用的每个参数创建变量。

enter image description here

第2步 在“控制流”选项卡上选择执行查询的任务

第3步转到此任务的属性,通过单击“...”按钮选择表达式

enter image description here

步骤4 选择命令属性,然后单击“...”按钮 enter image description here

第5步现在,您可以在此处构建查询,包括您在步骤1中定义的变量。完成后保存。享受!

答案 2 :(得分:1)

好的,我就是这样做的。

在您的控制流上创建一个执行SQL任务。设置数据库连接。在SQLStatment中执行类似的操作。

select getdate() -1 startDate , getdate() endDate

将genral选项卡上的ResultSet设置为Single Row。转到结果集选项卡单击添加提供类似StartDate的结果名称,然后添加新变量。

Name: startDate  (must be the same name as the alius in the select)
Namespace: user 
type:  DateTime
Value:  02-09-2013

现在,当它运行时,它应该用当前日期和昨天日期填写用户变量。从EndDate做同样的事情

创建第二个执行SQL任务将其链接到第一个。添加此SQL语句。 ?将是你的变量

select stuff
WHERE CONVERT(varchar, call_date, 112) BETWEEN ? AND ?

转到Paramater映射。 添加一个

Variable Name should be something like User::StartDate 
Direction Input
Datetype: Nvarchar
Parameter name: 0 
Parameter size: 0

添加第二个

Variable Name should be something like User::EndDate 
Direction Input
Datetype: Nvarchar
Parameter name: 1
Parameter size: 0

添加第三个时,只需添加参数名称2 ...

运行它。

答案 3 :(得分:0)

这是OLE DB Apporach:

为您的包创建一些参数。如果你将它们设为必需,那么它们就是必需的,如果没有某些值,你的包将无法运行。 “值”列中的字段将是默认值,用于调试。

enter image description here

然后创建一个变量并添加一个表达式:

enter image description here

enter image description here

表达式编辑器使用C#的褪色版本(如果你很好奇)

同样确保在变量之间的字符串中添加空格很难看到但是AND在两边都有空格,如下所示:

“和”

我差点忘了。 yor参数的值必须在'singleQuotes'中。这可以通过以下两种方式之一完成:您可以在为字符串赋值时包含引号,也可以在表达式中添加一些引号(我通常会这样做)。

在表达式中添加它们看起来像这样:

"some stuff " + "'" + @[variable] + "'"

单击evaluate expression以查看变量是否包含正确的字符串。

最后一步是添加一个OLE DB Source,设置连接(如果还没有),并从变量中添加查询。

enter image description here