原因是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)