【问题标题】:Creating a SQL Loop to Change the Table Name创建 SQL 循环以更改表名
【发布时间】:2021-05-12 10:00:01
【问题描述】:

我需要在循环中将表名的结束编号更改为从 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

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

【问题讨论】:

  • 调试动态SQL最简单的方法是PRINT它。如果你这样做了,你会看到table[1] 不是一个有效的对象名。但是,这种类型的 SQL 强烈表明您存在设计缺陷。

标签: sql sql-server loops ssms sql-server-2016


【解决方案1】:

您的 QUOTENAME 应该围绕整个表名。

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

【讨论】:

  • 太棒了。谢谢你。一旦允许,我会将其标记为已接受。
  • 优秀。谢谢。
【解决方案2】:

你仍然可以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,为什么临时表中的列是 varchar

【讨论】:

  • 当我创建这个通用示例时,一些特性没有改变。我必须遍历 12.2019 到 12.2020 的月/年组合,所以第一个答案效果最好。
  • 如果您提供的正是您所需要的,我相信这也可以在没有循环的情况下完成。听起来像一个计数表连接
猜你喜欢
  • 2017-12-15
  • 2021-03-06
  • 2022-12-08
  • 2020-09-09
  • 1970-01-01
  • 1970-01-01
  • 2019-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多