将参数传递给 OLE DB SOURCE
Posted
技术标签:
【中文标题】将参数传递给 OLE DB SOURCE【英文标题】:Pass Parameters to OLE DB SOURCE 【发布时间】:2014-09-25 03:37:26 【问题描述】:我是 SSIS 新手,无法将参数传递给 OLE DB 源。我想查询给定日期范围的数据。
我有两个变量,数据类型为日期时间的变量 1,变量的值由表达式 DATEADD("day", -1, GETDATE())
设置。数据类型为日期时间的变量2,变量的值由表达式DATEADD("day", 0, GETDATE())
设置
在 OLE DB SOURCE 内部,数据访问模式设置为 SQL 命令,下面是 SQL 代码。
Select Col1, col2, col3, col4, coldate where Col1 = 'abc' and coldate between convert(varchar(10), ?, 101) and convert(varchar(10), ?, 101)
我已将参数映射为
Parameter0, User::variable1, 输入
参数1,用户::变量2,输入
点击预览时出现错误
“显示预览时出错
附加信息: 没有为一个或多个必需参数提供值。 (Microsoft SQL Server Native Client 11.0)"
当我调试任务时,我得到的错误是
[OLE DB 源 [38]] 错误:SSIS 错误代码 DTS_E_OLEDBERROR。发生 OLE DB 错误。错误代码:0x80040E21。 OLE DB 记录可用。来源:“Microsoft SQL Server Native Client 11.0”Hresult:0x80040E21 描述:“转换规范的字符值无效”。
注意:coldate 列的数据类型是日期时间
请帮我解决这个问题。 我能够使用来自 OLE DB 源中的变量的数据访问模式 SQL 命令成功查询,但我被要求不要将数据访问模式用作 SQL 命令。 谢谢。
【问题讨论】:
DATEADD 的语法是DATEADD(day, -1, GETDATE())
如果我在 SSIS 中使用语法 DATEADD(day, -1, GETDATE()) 会出现错误。 msdn.microsoft.com/en-us/library/ms141719.aspx
如果 ColDate 是日期时间,为什么要在查询中将参数转换为 varchar?如果去掉转换函数会发生什么?
【参考方案1】:
如果您确定您正在正确映射变量,那么这就是我的建议:
SSIS 使用它自己的数据类型。我过去在使用 SSIS 日期时间时遇到过麻烦,所以每当我从 SSIS 中将变量传递给 TSQL 语句时,我都会尝试仅使用字符串(如果可能的话)。
我建议将您在 SSIS 中的变量设置为字符串,以接收您尝试过滤的日期值。您可以在当前用于实现 dateadd 语句的同一语句中转换为 SSIS 中的字符串。
SSIS 变量表达式示例:
(DT_STR,4,1252) DatePart("yyyy",dateadd("day", -1, getdate())) + "-" +
Right("0" + (DT_STR,4,1252) DatePart("m", dateadd("day", -1, getdate())),2) + "-" +
Right("0" + (DT_STR,4,1252) DatePart("d", dateadd("day", -1, getdate())),2)
然后像这样简化你的 TSQL 语句:
Select Col1, col2, col3, col4, coldate
where Col1 = 'abc'
and coldate between ? and ?
旁注。当您以这种方式传递您的 TSQL 语句时。 SQL Server 知道,当使用日期列和 between 语句时,作为字符串传递的边界应转换为 sql server 列类型 datetime。如果可用,中间仍然会使用适当的索引。它不会成为隐式转换的牺牲品,这些隐式转换可能会阻碍在接收不正确类型进行比较的其他查询中正确选择索引。您可以通过 show execution plan 在 SSMS 中进行测试。
【讨论】:
好 - 很高兴听到它。就像我说的 - 我也遇到了 SSIS 数据类型转换的问题。以上是关于将参数传递给 OLE DB SOURCE的主要内容,如果未能解决你的问题,请参考以下文章
将参数传递给 DB .execute 以获取 WHERE IN... INT 列表