【问题标题】:Remove while loop in T-SQL statement删除 T-SQL 语句中的 while 循环
【发布时间】:2016-03-30 16:07:38
【问题描述】:

过程中有一些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

【问题讨论】:

  • 有很多关于使用计数表填充日期表的示例?你有没有尝试搜索任何东西?线索是生成数字范围并使用简单的INSERT INTO ... SELECT ... FROM (tally) ... WHERE (loop condition)

标签: sql sql-server-2008 tsql while-loop temp-tables


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-14
    • 2017-03-09
    • 1970-01-01
    • 2014-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多