我正在尝试以.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
锚点之间的类型不匹配 和“Num”列中的递归部分 递归查询“NumTab”。
我已尝试将所有数字投放到decimal(2,1)
而结果没有变化。肯定有一些我不知道的东西......
答案 0 :(得分: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之后的部分投射完整列而不是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
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),例如if 9.9 + 0.9 = 10.8
,这是一个小数(3,1)。所以锚和递归部分的类型不同。