我是 SSIS 新手,在将参数传递到 OLE DB 源时遇到问题。我想查询给定日期范围内的数据。
我有两个变量,数据类型为日期时间的变量1,变量的值由表达式DATEADD("day", -1, GETDATE())
设置。数据类型为 Date Time 的变量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)
我已将参数映射为
参数0,用户::变量1,输入
参数1,用户::变量2,输入
当我点击预览时,出现错误
"There was an error displaying the preview
Additional Information: No Value given for one or more required parameters. (Microsoft SQL Server Native Client 11.0)"
当我调试任务时,我得到的错误是
[OLE DB Source [38]] Error: SSIS Error Code DTS_E_OLEDBERROR. An OLE DB error has occurred. Error code: 0x80040E21. An OLE DB record is available. Source: "Microsoft SQL Server Native Client 11.0" Hresult: 0x80040E21 Description: "Invalid character value for cast specification".
注意:列 colate 的数据类型是日期时间
请帮我解决这个问题。 我能够使用 OLE DB 源内部变量的数据访问模式 SQL 命令成功查询,但系统要求我不要使用数据访问模式作为 SQL 命令。 谢谢。
最佳答案
如果您确定正确映射了变量,那么我的建议是:
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 列类型日期时间。如果可用的话,两者之间仍将使用适当的索引。它不会成为隐式转换的牺牲品,隐式转换可能会阻碍其他接收不正确类型进行比较的查询中正确的索引选择。您可以通过显示执行计划在 SSMS 中测试这一点。
关于sql - 将参数传递给 OLE DB SOURCE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26030069/