sql - 将参数传递给 OLE DB SOURCE

标签 sql sql-server ssis msbi

我是 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/

相关文章:

SQL 数据透视字符串数据

mysql - 如何只将一个表中的一列插入到多列表中?

sql - ActiveRecord:基于关联列的平均值对表进行排序

asp.net - SQL Server - 数据库问题

sql-server - 数据仓库 SSIS 或存储过程的加载过程?

sql - 如果一列为空,如何删除整行

c++ - 如何在 Linux 上从 C++ 连接并执行对 SQL Server 的简单查询

asp.net - 什么基准可以测试我的 ASP.NET、SQL Server、IIS 产品的硬件性能?

ssis - 如何读取以小写 thorn 作为分隔符的平面文件

sql - 在SSIS中将带有逗号分隔符的单列数据拆分为多列