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的反面决定参数类型时进行了隐式转换。试试这个测试:
- 与包含日期(时间)列的 table 建立有效的 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)
我有一个 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的反面决定参数类型时进行了隐式转换。试试这个测试:
- 与包含日期(时间)列的 table 建立有效的 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)