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

SSIS match datetime variable to varchar in data flow

我有一个 table,其中有一列以 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:我最不想做的就是定义另一个字符串变量来解决)。

原因是SSIS数据源在根据operator的反面决定参数类型时进行了隐式转换。试试这个测试:

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

SELECT 1 FROM table WHERE ? > 1

SELECT 1 FROM table WHERE ? > '1'

SELECT 1 FROM table WHERE ? > date_col

  1. 执行数据流。
  2. 在 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)