SQL 中的嵌套 While 循环?

Nested While loops in SQL?

我想更改我的 SQL 代码,该代码使用两个嵌套的 While 循环生成 n table,例如:

DECLARE @count1 INT
SET @count1 = 2012
 DECLARE @count2 INT
 SET @count2 = 1
 WHILE @count1 <= 2016
 BEGIN
WHILE @count2 <= 12
  create table LGDfigRecov as
select   ...
from ...
WHERE FD0.mo_id=count2
   AND FD0.an_id= count1
...
SET @count2 += 1
END
SET @count1 += 1
END

如何每次更改新的 table 的名称,如 "LGDfigRecov +count1+count2"?这意味着我想每次都创建一个新的 table,最后是年份和月份的名称。

您可以使用这样的查询来创建您的报表。

WITH 
MonthNumbers AS (SELECT * FROM(VALUES('01'),('02'),('03'),('04'),('05'),('06'),('07'),('08'),('09'),('10'),('11'),('12')) AS x(MonthNr))
,YearNumbers AS  (SELECT * FROM(VALUES('2012'),('2013'),('2014'),('2015'),('2016')) AS x(YearNr))
SELECT ROW_NUMBER() OVER(ORDER BY YearNr,MonthNr) AS SortInx
      ,CONCAT('CREATE TABLE LGDfigRecov_',YearNr,'_',MonthNr,' AS ', CHAR(13) + CHAR(10)) +
       CONCAT('SELECT ... FROM ... ', CHAR(13) + CHAR(10)) + 
       CONCAT('WHERE FD0.mo_id=',MonthNr,' AND FD0.an_id=',YearNr,';') AS Cmd
FROM MonthNumbers
CROSS JOIN YearNumbers

我总是尽量避免不必要的循环和程序方法...

  • 检查它们是否是有效语法(只需将输出复制到新查询中 window)
  • 从此SELECT开一个CURSOR
  • 使用 CURSOR 将此按行提取到变量中 @Cmd
  • 使用EXEC (@Cmd)

下面的代码将有助于实现您的目标。

声明@count1 INT, @w_SQL nvarchar(4000); SET @count1 = 2012 声明@count2 INT 设置@count2 = 1 当@count1 <= 2016 开始 当@count2 <= 12 SET @w_SQL = 'create table LGDfigRecov' + CONVERT(nvarchar(10), @count1) + CONVERT(nvarchar(10), @count2) + 'as select ... 从 ... 其中 FD0.mo_id=count2 AND FD0.an_id= count1 ...'<br> 执行 sp_executesql @w_SQL 设置@count2 += 1 结尾 SET @count1 += 1