2011-02-06 12 views
0

-1から1までの数字のリストを0.1単位で生成しようとしています。次のコードは私にエラーを与えている:私は結果に変化はないとdecimal(2,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".

。そこ

答えて

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 

DECIMAL(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は、暗黙的に10進数(2,1)にキャストされます。ただし、.1(暗黙的に小数点(1,1)である)の別のリテラルを追加すると、小数点(2,1)データを小数点(3,1)に先取りする可能性があります。 9.9 + 0.9 = 10.8の場合、小数点(3,1)です。したがって、型はアンカー部分と再帰部分の間で異なります。

+0

キャストがなぜ必要なのか、あなたは言うことができますか? –

+0

@John - 更新された回答を参照 – RichardTheKiwi

+0

+1すばらしい説明、ありがとう! – RedFilter