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 ? > 1
(@P1 varchar(8))SELECT 1 FROM table WHERE ? > '1'
(@P1 datetime)SELECT 1 FROM table WHERE ? > date_col
换句话说,SQL 命令将解释传入参数的类型,而不管它原来是什么类型。
所以在我的问题中,dateTime
参数首先被隐式转换为具有未知格式的varchar
,而不是我们尝试将其转换为指定的date
类型:
SELECT * FROM table where date = CONVERT(varchar(10), 'Jan 01 2019 12:00:00', 112)
【讨论】:
以上是关于SSIS将日期时间变量与数据流中的varchar匹配的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法将当前日期与以 VARCHAR 格式存储在数据库中的日期进行比较?