2011-02-06 70 views
0

我想以-1增量生成-1到1的数字列表。以下是代码是给我的错误:使用递归CTE铸造错误

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

Types don't match between the anchor and the recursive part in column "Num" of recursive query "NumTab".

我已经尝试了所有的数字铸造decimal(2,1)在结果没有变化。一定有什么明显的我失踪...

回答

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 

十进制(2,1)应该工作,但只适用于部分投后全列,而不是民的一部分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)。所以类型在锚和递归部分之间不同。

+0

你可以说为什么演员是必要的吗? – 2011-02-06 01:18:28