创建一个 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
=]
我需要在循环中将 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
=]