在sql server中生成序列

时间:2011-03-11 22:30:53

标签: sql-server-2005 cursor sequence

我正在开发一个函数,它将低数字和高数字作为参数,并返回一个包含(和包括)之间所有内容的表。

我知道我可以使用游标并增加一个变量,每次迭代都将它添加到基于作用域的表中,但是如果可能的话我宁愿避免使用游标。有没有其他人有建议这样做的方法? (因为我正在输入这个我认为可能是CTE,我会去调查)。

2 个答案:

答案 0 :(得分:4)

是的,您可以使用recursive CTE来执行此操作。例如,生成10到20之间的数字:

WITH f AS
(
    SELECT 10 AS x
    UNION ALL
    SELECT x + 1 FROM f WHERE x < 20
)
SELECT * FROM f

答案 1 :(得分:2)

只需创建一个索引的永久辅助数字表并完成它。这将执行任何其他方法。

See Jeff Moden's answer here for more details以及填充此类表格的脚本。如果出于某种原因,这不是一个选项,根据链接答案中的性能测试,这应该超过递归CTE。

   WITH E00(N) AS (SELECT 1 UNION ALL SELECT 1),
        E02(N) AS (SELECT 1 FROM E00 a, E00 b),
        E04(N) AS (SELECT 1 FROM E02 a, E02 b),
        E08(N) AS (SELECT 1 FROM E04 a, E04 b),
        E16(N) AS (SELECT 1 FROM E08 a, E08 b),
        E32(N) AS (SELECT 1 FROM E16 a, E16 b),
   cteTally(N) AS (SELECT ROW_NUMBER() OVER (ORDER BY N) FROM E32)
   SELECT N FROM cteTally
   WHERE N BETWEEN 10 AND 20