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
我想更改我的 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