我有两个值,其中包含十进制(15,2)数据类型
例如
@from='19.99'
和
@to='20.02'
我必须返回两个值之间的范围
预期输出 - 19.99, 20.00, 20.01, 20.02
答案 0 :(得分:4)
您可以使用Tally / Number方法,如下所示
DECLARE @from DECIMAL(10,2) , @to DECIMAL(10,2), @interval DECIMAL(10,2)
SET @from=19.99
SET @to= 20.02
SET @interval=0.01
SELECT @from +r*@interval
FROM
(
SELECT TOP (SELECT CAST((@to-@from)/@interval AS INT)+1)
ROW_NUMBER() OVER( ORDER BY (SELECT 1)) -1 r
FROM
sys.objects s1 CROSS JOIN sys.objects s2
)T
的 Working demo 强>
答案 1 :(得分:2)
尝试:
+=======+
| Value |
+=======+
| 19,99 |
+-------+
| 20,00 |
+-------+
| 20,01 |
+-------+
| 20,02 |
+-------+
结果:
CTE
使用DECLARE @From DECIMAL (15,2) = 19.99;
DECLARE @To DECIMAL (15,2) = 20.02;
DECLARE @Step DECIMAL (15,2) = 00.01;
WITH CTE AS(
SELECT @Step * 1 Val
UNION ALL
SELECT @Step * 2
UNION ALL
SELECT @Step * 3
UNION ALL
SELECT @Step * 4
)
SELECT @From - @Step + CTE.Val Value FROM CTE;
:
+=======+
| Value |
+=======+
| 19,99 |
+-------+
| 20,00 |
+-------+
| 20,01 |
+-------+
| 20,02 |
+-------+
结果:
{{1}}
答案 2 :(得分:1)
您可以使用递归CTE:
with cte as (
select @from as val
union all
select cast(val + 0.01 as decimal(15,2))
from cte
where density < @to
)
select val
from cte
option (MAXRECURSION 0);
注意:如果要插入的行数超过100行,则需要探索max recursion选项。
你也可以用“数字”表做类似的事情。