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