ошибка приведения при использовании рекурсивного CTE - PullRequest
0 голосов
/ 06 февраля 2011

Я пытаюсь создать список чисел от -1 до 1 с шагом 0,1.Ниже приведен код, выдающий мне ошибку:

WITH NumTab AS(
    SELECT -1.0 AS Num 
    UNION ALL 
    SELECT Num + .1
    FROM NumTab 
    WHERE Num <= 1.0
)
SELECT * FROM NumTab

Типы не совпадают между якорем и рекурсивной частью в столбце «Num» рекурсивного запроса «NumTab».

Я попытался привести все числа к decimal(2,1) без изменений в результатах.Должно быть что-то очевидное, чего мне не хватает ...

1 Ответ

5 голосов
/ 06 февраля 2011

Отлите обе части одинаково

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). Таким образом, типы отличаются между якорной и рекурсивной частями.

...