Отлите обе части одинаково
WITH NumTab AS(
SELECT cast(-1.0 as decimal(20,10)) AS Num
UNION ALL
SELECT cast(Num + .1 as decimal(20,10))
FROM NumTab
WHERE Num <= 1.0
)
SELECT * FROM NumTab
Десятичное число (2,1) должно работать, но приводить полный столбец, а не Num-часть только для части после UNION
Если вы проверите вывод после этих утверждений:
SELECT -1.0 AS Num into dummytable
select Num + .1 as num2 into dummytable2 from dummytable
exec sp_columns dummytable
exec sp_columns dummytable2
Ouptut:
TABLE_NAME COLUMN_NAME TYPE_NAME PRECISION LENGTH SCALE
dummytable Num numeric 2 4 1
dummytable2 num2 numeric 3 5 1
Литерал -1.0 неявно приводится к десятичному (2,1). Однако, когда вы добавляете другой литерал .1 (который является неявно десятичным (1,1)), он может склонить десятичные (2,1) данные к десятичному (3,1), например. если 9.9 + 0.9 = 10.8
, что является десятичным числом (3,1). Таким образом, типы отличаются между якорной и рекурсивной частями.