创建一个 SQL 循环来更改 Table 名称

Creating a SQL Loop to Change the Table Name

我需要在循环中将 table 名称的结尾编号从 1 更改为 12。这是我的实际问题的一个更直接的示例,但如果可以解决,然后我可以稍后复制结果(实际问题是滚动使用过去 12 个月的报告,并且所有单独的月份都单独存储)。我知道我可以创建一个字符串查询,每个查询都与另一个查询联合,但在需要更改时我仍然必须编辑所有 12 个查询。我正在寻找更高效的流程。

Declare @Query VARCHAR(MAX)
DECLARE @i INT
CREATE TABLE #Accounts (Account varchar(10))
SET @i = 1


WHILE @i <= 12
BEGIN
Select @Query = 'Select COUNT(ACCT) From dbo.table_'+quotename(@i)
   INSERT INTO #Accounts
    EXEC(@Query)
   SET @i = @i + 1;
END;

SELECT Account FROM #Accounts

当我 运行 此代码时,我得到 table 的无效对象名称,因为它没有将数字附加到名称的末尾。这可以使用 while 循环吗?还是我必须开始研究游标?

您的 QUOTENAME 应该围绕整个 table 名称。

Declare @Query VARCHAR(MAX)
DECLARE @i INT
CREATE TABLE #Accounts (Account varchar(10))
SET @i = 1


WHILE @i <= 12
BEGIN

print quotename(@i)
Select @Query = 'Select COUNT(ACCT) From dbo.'+quotename('table_'+convert(nvarchar,@i))
   INSERT INTO #Accounts
   EXEC(@Query)
   SET @i = @i + 1;
END;

SELECT Account FROM #Accounts

你仍然可以UNION ALL,你只需要一次构造所有的动态查询,没有循环。

DECLARE @sql nvarchar(max) =
'INSERT INTO #Accounts (Account)
' +
(
SELECT STRING_AGG(
    N'Select COUNT(ACCT) From dbo.' + QUOTENAME(N'table_' + i),
    CAST(N'
UNION ALL
' AS nvarchar(max)))
FROM (VALUES('1'),('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9'),('10'),('11'),('12') ) AS v(i)
);

EXEC (@sql);

不过,我想问的是,如果要插入 COUNT[=14,为什么临时 table 中的列是 varchar =]