2011-03-11 107 views
4

我正在研究一個函數,該函數將參數的數目和數目都設爲低,並返回一個包含(和包含)之間所有內容的表。在sql server中生成一個序列

我知道我可以使用遊標並增加一個變量,每次迭代都會將它添加到基於範圍的表中,但是如果可能的話,我寧願避免遊標。有沒有其他人有一個方法來做到這一點的建議? (當我輸入這個即時通訊思維可能是一個CTE,我將去調查)。

+0

SQL服務器2011( 「德納」)將具有[適當的序列](http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/a-first-look-at-sequences-in -sql-server)當它出來時... –

+0

@marc_s - 它們可以用作adhoc輔助數字表嗎? –

回答

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 
+0

我正在尋找相當於PostgreSQL generate_series()。首先,我嘗試了遞歸CTE,但與此相比,它有1M記錄的時間滯後。 – Waqar

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 
+0

非常好的解決方案。謝謝! – Kyle

+1

偉大的解決方案,但請注意,默認情況下,結果的最大數目設置爲100,並且您可以使用OPTION(maxrecursion 32767)將其增加到32767; – pcofre

+1

@pcofre - 您可以使用'OPTION(MAXRECURSION 0)'來實現無限制,但性能可能會成爲問題。 –