Генерация последовательности в SQL Server - PullRequest
4 голосов
/ 12 марта 2011

Я работаю над функцией, которая принимает в качестве параметров меньшее число и большое число и возвращает таблицу, содержащую все между (и включая).

Я знаю, что могу использовать курсор и увеличивать переменную, добавляя ее в таблицу на основе области действия на каждой итерации, но я бы предпочел избегать курсора, если это возможно. У кого-нибудь еще есть предложения, как это сделать? (Поскольку я набираю это, я думаю, возможно, CTE, который я пойду исследовать).

Ответы [ 2 ]

4 голосов
/ 12 марта 2011

Да, вы можете использовать рекурсивный CTE , чтобы сделать это. Например, для генерации чисел от 10 до 20 включительно:

WITH f AS
(
    SELECT 10 AS x
    UNION ALL
    SELECT x + 1 FROM f WHERE x < 20
)
SELECT * FROM f
2 голосов
/ 12 марта 2011

Просто создайте индексированную таблицу постоянных вспомогательных номеров и покончите с этим. Это будет выполнять любой другой метод.

См. Ответ Джеффа Модена здесь для более подробной информации и сценарий для заполнения такой таблицы. если по какой-то причине это невозможно, это должно превзойти рекурсивное 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...