当使用MERGE JOIN时,我遇到了一个应该由连接表上的条件过滤掉的行中的值的转换错误。
这是一个小例子:
declare @Types as table (
[Id] [int] PRIMARY KEY,
[Type] nvarchar(10) NOT NULL)
insert @Types values
(1, 'Time'),
(2, 'Number')
declare @Values as table (
[Id] [bigint] IDENTITY PRIMARY KEY,
[TypeId] [int] NOT NULL,
[LogDate] [date] NOT NULL,
[Value] [nvarchar](256) NOT NULL)
insert @Values values
(1, '2018-03-01', '07:03:04'),
(2, '2018-03-01', '565')
select [Values].LogDate, [Types].[Type], convert(int, [Value]) as [Value]
from @Types [Types]
inner MERGE JOIN @Values [Values]
on [Values].TypeId=[Types].Id
where [Type] = 'Number'
该查询应该只使用标有TypeId = 2的@Values中的行,即' Number' s。但运行它会出现此错误:
Msg 245, Level 16, State 1, Line 17
Conversion failed when converting the nvarchar value '07:03:04' to data type int.
如果将连接提示更改为使用LOOP或HASH连接,则查询可以正常运行,并给出预期结果:
LogDate Type Value
---------- ---------- -----------
2018-03-01 Number 565
另一种解决方法是使用try_convert()而不是convert()
但是,当使用MERGE JOIN时,这是否真的可以预料到?通常,您可以假设选择列表中的计算仅在查询的行上执行,对吧?或者,当这可能是一个问题时,查询优化器通常会避免合并连接吗?