CTE数据转换错误 - 临时表很好

时间:2012-10-15 17:05:35

标签: sql-server-2005 common-table-expression type-conversion

所以,我有一个错误的CTE:Msg 8114, Level 16, State 5, Line 1 Error converting data type nvarchar to float.问题是,如果我将CTE分解为临时表,一切运行正常!

下面是对我正在做的事情的略微简化(数据类型是准确的,我只是重命名了事物,创建了虚假数据,删除了一些额外的连接以及哪些子句似乎不会影响错误等) ...请注意,此示例可以正常工作,这只会增加我的困惑:

--Build and populate sample data
create table vals
(
    groupID int,
    valName nvarchar(50),
    val     nvarchar(50)
)
insert into vals(groupID, valName, val)
select 1, 'setting1', '12:00' union
select 1, 'setting2', '18:00' union
select 1, 'setting3', '3.2' union
select 2, 'setting1', '9:00' union
select 2, 'setting3', '4' union
select 2, 'setting5', 'steve'

create table collected
(
    groupID int,
    timeUTC datetime,
    collected float
)
insert into collected(groupID, timeUTC, collected)
select 1, '2012-09-12 18:00', 2.8 union
select 1, '2012-09-12 18:30', 3.0 union
select 1, '2012-09-12 19:00', 3.3 union
select 1, '2012-09-12 19:30', 4.0 union
select 1, '2012-09-12 20:00', 2.5 union
select 2, '2012-09-12 18:00', 3.5 union
select 2, '2012-09-12 18:30', 3.9 union
select 2, '2012-09-12 19:00', 4.6 union
select 2, '2012-09-12 19:30', 4.2 union
select 2, '2012-09-12 20:00', 4.3


--Here's the CTE that errors on the actual dataset
;with triggerVal as (
    select groupID,
        [trg] = min(cast(val as float))
    from vals
    where valName = 'setting3'
    group by groupID
), currentVal as (
    select c.groupID, c.timeUTC,
        [curr] = c.collected
    from collected c
        join (
            select groupID, [lastTime] = max(timeUTC)
            from collected
            group by groupID
        ) l on c.groupID=l.groupID
            and c.timeUTC = l.lastTime
)
select t.groupID, c.timeUTC, t.trg, c.curr
from triggerVal t
    join currentVal c on t.groupID=c.groupID

同样,在我的实时数据中,如果我将上述CTE分解为临时表(#triggerVal#currentVal),一切运行正常。虽然我修改代码并不是世界末日,但我真的很想了解发生了什么!

0 个答案:

没有答案