0

だから、私はエラーをスローしている CTE を持っています:Msg 8114, Level 16, State 5, Line 1 Error converting data type nvarchar to float. 問題は、CTE を一時テーブルに分割すると、すべてが正常に実行されることです!

以下は、私がやっていることを少し単純化したものです (データ型は正確です。名前を変更しただけで、偽のデータを作成し、いくつかの余分な結合を削除し、エラーに影響しないと思われる where 句など)...このサンプルは正しく機能することに注意してください。これは私の混乱を招くだけです。

--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) に分割すると、すべて正常に実行されます。私のコードを変更することは世界の終わりではありませんが、何が起こっているのかを本当に理解したいです!

4

0 に答える 0