使用合并连接时未包括的行的转换错误

时间:2018-04-23 09:59:56

标签: sql-server

当使用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时,这是否真的可以预料到?通常,您可以假设选择列表中的计算仅在查询的行上执行,对吧?或者,当这可能是一个问题时,查询优化器通常会避免合并连接吗?

0 个答案:

没有答案