我是SSIS的新手,无法将参数传递给OLE DB Source。我想查询给定日期范围的数据。
我有两个变量,数据类型为Date Time的variable1,变量的值由表达式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,input
Parameter1,User :: variable2,input
当我点击预览时,出现错误
"显示预览
时出错其他信息: 没有给出一个或多个必需参数的值。 (Microsoft SQL Server Native Client 11.0)"
当我调试任务时,我得到的错误是
[OLE DB Source [38]]错误:SSIS错误代码DTS_E_OLEDBERROR。发生OLE DB错误。错误代码:0x80040E21。 OLE DB记录可用。来源:" Microsoft SQL Server Native Client 11.0" Hresult:0x80040E21描述:"转换规范的字符值无效"。
注意:列coldate的数据类型是datetime
请帮我解决这个问题。 我能够使用OLE DB Source中的变量使用数据访问模式SQL命令成功查询但我被要求不使用数据访问模式作为SQL命令。 谢谢。
答案 0 :(得分: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中对此进行测试。