我有一个表,该表的列以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:我要做的最后一件事是定义另一个字符串变量来解决)。
答案 0 :(得分:1)
原因是由于根据运算符的相反方向确定参数类型时,SSIS数据源进行了隐式转换。试试这个测试:
dateTime
变量。 SELECT 1 FROM table WHERE ? > 1
SELECT 1 FROM table WHERE ? > '1'
SELECT 1 FROM table WHERE ? > date_col
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)