使用递归CTE投射错误

Red*_*ter 0 sql sql-server-2005 common-table-expression

我试图以.1为增量从-1到1生成一个数字列表.以下是代码给我一个错误:

WITH NumTab AS(
    SELECT -1.0 AS Num 
    UNION ALL 
    SELECT Num + .1
    FROM NumTab 
    WHERE Num <= 1.0
)
SELECT * FROM NumTab
Run Code Online (Sandbox Code Playgroud)

锚和递归查询"NumTab"列"Num"中的递归部分之间的类型不匹配.

我已经尝试将所有数字投射到decimal(2,1)结果中没有变化.必须有一些我不知道的明显的东西......

Ric*_*iwi 5

平等地铸造两个部分

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
Run Code Online (Sandbox Code Playgroud)

十进制(2,1)应该可以工作,但是只能为UNION之后的部分投射完整列,而不是Num部分

如果在这些语句之后检查输出:

SELECT -1.0 AS Num into dummytable
select Num + .1 as num2 into dummytable2 from dummytable
exec sp_columns dummytable
exec sp_columns dummytable2
Run Code Online (Sandbox Code Playgroud)

Ouptut:

TABLE_NAME   COLUMN_NAME  TYPE_NAME  PRECISION  LENGTH  SCALE
dummytable   Num          numeric    2          4       1    
dummytable2  num2         numeric    3          5       1    
Run Code Online (Sandbox Code Playgroud)

文字-1.0隐式转换为十进制(2,1).但是,当你添加另一个字面值.1(隐式小数(1,1))时,它有可能将小数(2,1)数据倾斜为小数(3,1),例如,如果9.9 + 0.9 = 10.8,小数(3,1).因此锚和递归部分之间的类型不同.