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

时间:2019-01-28 04:15:02

标签: ssis ssis-2008

我有一个表,该表的列以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 个答案:

答案 0 :(得分:1)

原因是由于根据运算符的相反方向确定参数类型时,SSIS数据源进行了隐式转换。试试这个测试:

  1. 与包含date(time)列的表建立有效的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)