将参数传递给OLE DB SOURCE

Sez*_*era 7 sql sql-server ssis msbi

我是SSIS的新手,无法将参数传递给OLE DB Source.我想查询给定日期范围的数据.

我有两个变量,数据类型为Date Time的variable1,变量的值由expression设置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)
Run Code Online (Sandbox Code Playgroud)

我已将参数映射为

Parameter0,User :: variable1,输入

Parameter1,User :: variable2,输入

当我点击预览时,我收到一个错误

"显示预览时出错

附加信息:没有给出一个或多个必需参数的值.(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描述:"转换规范的字符值无效".

注意:列冷却的数据类型是datetime

请帮我解决这个问题.我能够使用OLE DB Source中的变量使用数据访问模式SQL命令成功查询但我被要求不使用数据访问模式作为SQL命令.谢谢.

RTh*_*mas 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)  
Run Code Online (Sandbox Code Playgroud)

然后像这样简化你的 TSQL 语句:

Select Col1, col2, col3, col4, coldate 
where Col1 = 'abc' 
and coldate between ? and ?
Run Code Online (Sandbox Code Playgroud)

边注。当您以这种方式传递 TSQL 语句时。SQL Server 知道,当使用日期列和 Between 语句时,作为字符串传递的边界应转换为 SQL Server 列类型日期时间。如果可用的话,两者之间仍将使用适当的索引。它不会成为隐式转换的牺牲品,隐式转换可能会阻碍其他接收不正确类型进行比较的查询中正确的索引选择。您可以通过显示执行计划在 SSMS 中测试这一点。