Удалить цикл while в операторе T-SQL

Были некоторые while циклы в процедуре, и я хочу удалить их / заменить временными таблицами или любой другой (не курсор) .

Ниже я создал фиктивный синтаксис, я должен заполнить TEMP_TABLE Таблица основана на некоторых расчетах. Пожалуйста, поделитесь любым лучшим вариантом, чтобы сделать то же самое:

SET @J = 0
SET @DIFFERENCE = 10
SET @INCREMENT = 2

WHILE (@J < @DIFFERENCE) 
BEGIN   
    SET @TO_DATE = (SELECT DATEADD(D, @INCREMENT, @TO_DATE))   

    IF (@TO_DATE <= GETDATE())
       INSERT INTO TEMP_TABLE 
       VALUES(@J, @TO_DATE)   

    SET @J = @J + @INCREMENT  
END

1 ответ

Решение

Вот один из способов использования Tally table

;WITH e1(n) AS
(
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
), -- 10
e2(n) AS (SELECT 1 FROM e1 CROSS JOIN e1 AS b), -- 10*10
e3(n) AS (SELECT 2 FROM e1 CROSS JOIN e2), -- 10*100
e4(n)  as ( SELECT n = ROW_NUMBER() OVER (ORDER BY n) FROM e3)
SELECT n,
       Dateadd(D, n, @TO_DATE)
FROM   e4
WHERE  N <= @DIFFERENCE
       AND N%@INCREMENT = 0 

Для получения дополнительной информации о Generate a set or sequence without loops

Другие вопросы по тегам