2011-02-06 60 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