SSIS将日期时间变量与数据流中的varchar匹配

Posted

技术标签:

【中文标题】SSIS将日期时间变量与数据流中的varchar匹配【英文标题】:SSIS match datetime variable to varchar in data flow 【发布时间】:2019-01-28 04:15:01 【问题描述】:

我有一个表格,其中有一列以 varchar(10) 格式存储日期,例如 '20190101'。我在 SSIS 中有一个变量被定义为 DateTime 格式。现在我想在SSIS OLE DB数据流源中进行值匹配,格式为SELECT * FROM table where date = CONVERT(varchar(10), ?, 112)

看起来转换没有正常工作;数据流中没有弹出符合条件的数据。

那么这个查询有什么问题(将其放入 SSMS 时结果看起来很好),以及如何调试它(无法使用数据源中的 SELECT CAST(? AS varchar(10) FROM table 之类的查询进行调试)。

(PS:我想做的最后一件事是定义另一个字符串变量来解决)。

【问题讨论】:

【参考方案1】:

原因是SSIS数据源在根据运算符对面决定参数类型时隐式转换。试试这个测试:

    与包含日期(时间)列的表建立有效的 SSIS 数据源连接;创建一个dateTime 变量。 将数据源切换为 SQL 命令,并一一键入以下查询:

SELECT 1 FROM table WHERE ? > 1

SELECT 1 FROM table WHERE ? > '1'

SELECT 1 FROM table WHERE ? > date_col

    执行数据流。 在 SSMS 中,引用最近的会话:

select top 50 t.text, s.* from sys.dm_exec_query_stats s CROSS APPLY sys.dm_exec_sql_text(sql_handle) t where t.text LIKE <filter your session> order by last_execution_time desc

您可能会发现参数的解释方式:

(@P1 int)SELECT 1 FROM table WHERE ? &gt; 1

(@P1 varchar(8))SELECT 1 FROM table WHERE ? &gt; '1'

(@P1 datetime)SELECT 1 FROM table WHERE ? &gt; date_col

换句话说,SQL 命令将解释传入参数的类型,而不管它原来是什么类型。

所以在我的问题中,dateTime 参数首先被隐式转换为具有未知格式的varchar,而不是我们尝试将其转换为指定的date 类型:

SELECT * FROM table where date = CONVERT(varchar(10), 'Jan 01 2019 12:00:00', 112)

【讨论】:

以上是关于SSIS将日期时间变量与数据流中的varchar匹配的主要内容,如果未能解决你的问题,请参考以下文章

将oracle日期分配给SSIS变量

SSIS将日期时间变量更改为其他格式

有没有办法将当前日期与以 VARCHAR 格式存储在数据库中的日期进行比较?

如何在 ssis 包中的变量中获取当前周星期一的日期

SSIS 将 m/dd/yyyy 转换为 yyyymmdd 不一致

如何将 DT_R8 存储在 SSIS 中的变量中