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

CMi*_*nor 21 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'
Run Code Online (Sandbox Code Playgroud)

我想用变量替换这些硬编码日期.就像是:

WHERE CONVERT(varchar, call_date, 112) BETWEEN STARTDATE AND ENDATE
Run Code Online (Sandbox Code Playgroud)

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

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

Ozr*_*ric 41

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

在SSIS中,您无法参数化ADO.NET源.您必须使用变通方法.

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

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

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

长话短说(或者说不那么短:),这样做:

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

对于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]) + "'"
Run Code Online (Sandbox Code Playgroud)

HTH

  • 我当然希望看到这个表达式被用于 sql 注入攻击。 (4认同)
  • 请注意,在设置表达式 **ADO.NET source** 后可能会显示错误,因为 source 中不会包含 SQL,但在运行 **SSIS** 后,SQL 将自动更新并解决错误。 (2认同)

DaI*_*mTo 0

好的,这就是我的做法。

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

select getdate() -1 startDate , getdate() endDate
Run Code Online (Sandbox Code Playgroud)

将常规选项卡上的 ResultSet 设置为 Single Row。转到“结果集”选项卡,单击“添加”,为结果命名,例如“开始日期”,然后添加一个新变量。

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

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

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

select stuff
WHERE CONVERT(varchar, call_date, 112) BETWEEN ? AND ?
Run Code Online (Sandbox Code Playgroud)

转到参数映射。添加一个

Variable Name should be something like User::StartDate 
Direction Input
Datetype: Nvarchar
Parameter name: 0 
Parameter size: 0
Run Code Online (Sandbox Code Playgroud)

添加第二个

Variable Name should be something like User::EndDate 
Direction Input
Datetype: Nvarchar
Parameter name: 1
Parameter size: 0
Run Code Online (Sandbox Code Playgroud)

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

运行。