如何在 ADO.NET 源 SSIS 中传递参数
Posted
技术标签:
【中文标题】如何在 ADO.NET 源 SSIS 中传递参数【英文标题】:How to Pass parameter in ADO.NET Source SSIS 【发布时间】:2013-11-20 10:29:19 【问题描述】:您好,我需要一些帮助这将是我的第一个 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 包的初学者,希望有人能帮助我
【问题讨论】:
嗨,你看过这个例子吗?真的很简单,可以显示您正在寻找的内容sqlserversolutions.blogspot.ch/2008/10/… 您使用 ADO.NET 组件有什么特别的原因吗?如果您不介意,您可以切换到允许从变量查询的 OLE DB 源 组件。然后,您可以为该变量创建所需功能的表达式。 @TsSkTo 这只是我知道如何在 ado.net 中完成我的项目,也许您可以告诉我如何在 OLEDB 中进行此操作? @Raphael 它对我有一点帮助,但它不是我在我的包中需要的 试试这个:***.com/questions/8582211/… 如果它不起作用,我会用 OLEDB 语义给出答案 【参考方案1】:由于这里的答案都没有真正回答问题(请注意 ADO.NET 源代码,而不是 OLE DB!),这里才是真正的答案。
在 SSIS 中,您不能对 ADO.NET 源进行参数化。您必须使用解决方法。
幸运的是,解决方法很少。一种是创建脚本组件,其行为类似于源代码并对其进行编码。然而,一个人并不总是能够轻松地将现有资源转换为脚本,尤其是在他缺乏 ADO.NET 编程知识的情况下。
还有另一种解决方法,那就是在 ADO.NET 源执行操作之前创建 SQL 查询。但是,当您打开 ADO.NET 源代码时,您会注意到数据访问模式不允许变量输入。那么,您将如何进行呢?
您想要动态设置 ADO.NET 源的 SQL 表达式,因此您必须告诉您的数据流任务使用 Expression 配置 SSIS ADO.NET 源组件。
为了使长话短说(或不那么短:),这样做:
在您的包中,使用源/目标组件输入您的数据流任务 单击背景上的任意位置,在属性面板中显示任务属性 在属性面板中找到表达式属性,可以配置各种数据源/目标属性,并使用省略号按钮(...)打开它 在“属性”下,选择您的源(例如 [ADO.NET 源].[SqlCommand])的 SQL 命令属性以添加一行 单击该行的省略号按钮以打开表达式生成器 在表达式生成器中构建您的动态查询最后一步对于日期/日期时间参数可能有些麻烦。但是,为了您的方便,这里是示例:
"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
【讨论】:
很好的答案!感谢您的帮助 闻起来像SQL INJECTION
:/
我当然希望看到这个表达式被用于 sql 注入攻击。
请注意,设置表达式后 ADO.NET source 可能会显示错误,因为源中没有 SQL,但在运行 SSIS SQL 之后将自动更新并解决错误。
难读,但确实如此,你可以应用表达式并分配 ADONET.Source.SQLCommand 动态 SQL【参考方案2】:
[ADO.NET 作为源类型解决方案]
第 1 步 为您要使用的每个参数创建变量。
第 2 步 在执行查询的控制流选项卡上选择任务
第 3 步通过单击“...”按钮转到此任务的属性以选择表达式
步骤 4 选择命令属性并点击“...”按钮
第 5 步 现在您可以在此处构建查询,包括您在第 1 步中定义的变量。完成后保存。尽情享受吧!
【讨论】:
这是给定问题的正确方法。这不是详细信息。使用此参考以获得完整的详细信息。基本上,ado 源公开了 sql 命令属性。这可以替换为控制流视图中的表达式。 blogs.msdn.microsoft.com/sqlforum/2011/04/10/…【参考方案3】:好的,这就是我的做法。
在您的控制流上创建一个执行 SQL 任务。设置数据库连接。在 SQLStatment 中执行类似操作。
select getdate() -1 startDate , getdate() endDate
将常规选项卡上的 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 ?
转到参数映射。 添加一个
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...
运行它。
【讨论】:
我为你添加了一篇博文。图片可能更容易理解。欢迎享受 SSIS 的乐趣。 daimto.com/ssis-package-variables【参考方案4】:这是 OLE DB 方法:
为你的包创建一些参数。如果您将它们设为必需,那么它们是必需的,并且您的包在没有某些值的情况下将无法运行。值列中的字段将是默认值并用于调试。
然后创建一个变量并添加一个表达式:
表达式编辑器使用旧版 C#(如果您好奇的话)
另外请确保在变量之间的字符串中添加空格它很难看到,但 AND 在两边都有一个空格,如下所示:
“与”
我差点忘了。你的参数值必须在'singleQuotes'中。这可以通过以下两种方式之一完成:您可以在为字符串赋值时包含引号,也可以在表达式中添加一些引号(我通常这样做)。
在表达式中添加它们看起来像这样:
"some stuff " + "'" + @[variable] + "'"
单击评估表达式以查看您的变量是否包含正确的字符串。
最后一步是添加一个 OLE DB 源,设置连接(如果您还没有连接)并添加来自变量的查询。
【讨论】:
感谢您给了我新的玩意。使用 (DT_WSTR, 30)(DT_DBDATE) DATEADD("Day",7, GETUTCDATE() ) 创建一个表达式就像一个魅力。我不知道来自变量功能的 SQL 命令。我需要试试。 这是很好的信息,但由于问题指定了 ADO.NET,因此似乎让人分心。我在想微软没有从 OLE DB 中引入这种技术是有原因的? @ffejrekaburb 请注意原始问题上的 cmets。我建议 OP 切换到 OLE DB,他们特别要求解决方案。以上是关于如何在 ADO.NET 源 SSIS 中传递参数的主要内容,如果未能解决你的问题,请参考以下文章
SSIS Passing Parameters to an ADO .NET Source query;向ado.net数据源传递参数。
SSIS 将 ADO Net 源聚合到 SQL Server 数据库中
LDAP SSIS 在 ADO.NET 数据源上引发一般错误
在 ASP.Net Core 项目中使用 ADO.Net 将 JSON 类型作为参数传递给 SQL Server 2016 存储过程