如何在不使用while循环的情况下在SQL Server中进行迭代

时间:2018-12-26 05:56:23

标签: sql sql-server

我有一个临时表,其中有几个表名,如下所示:

Id   TableName
-------------
1    TableA
2    TableB
3    TableC

这些表名应在所示查询中替换,并应执行。我可以使用while循环来实现它,但是我不想使用while。还有其他替代概念吗?

我有以下SQL语句:

SELECT 
    TDU.ColHeader, TDU.ColValues 
FROM 
    (SELECT 
         ' + @ColumnsCasted + ' 
     FROM 
         ' + @TableName + ' ' + 
     @WhereCondition + ') TD
UNPIVOT 
     (ColValues FOR ColHeader IN (' + @ColumnsUnpivot + ')
     ) AS TDU;

@TableName@ColumnsCasted@ColumnsUnpivot基于存储在临时表中的表名。我使用了while循环来迭代每个表名,并在语句中将其替换。

谁能建议一个不使用while循环的方法?

2 个答案:

答案 0 :(得分:2)

您可以尝试生成并执行动态SQL。下一个示例仅用于SELECT * FROM Table语句,您必须为查询更改它:

-- Create table
CREATE TABLE #TempTable (
   Id int,
   TableName nvarchar(50)
)
INSERT INTO #TempTable (Id, TableName)
VALUES 
   (1, 'TableA'),
   (2, 'TableB'),
   (3, 'TableC')

-- Dynamic SQL
DECLARE @stm nvarchar(max)
DECLARE @err int

SET @stm = N''
SELECT @stm = 
   @stm +
   'SELECT * FROM ' + 
   QUOTENAME(TableName) +
   '; '
FROM #TempTable

-- Statement execution
PRINT @stm   
EXEC @err = sp_executesql @stm
IF @err <> 0 PRINT 'Error'
ELSE PRINT 'OK'

生成的语句:

SELECT * FROM [TableA]; SELECT * FROM [TableB]; SELECT * FROM [TableC];

答案 1 :(得分:1)

有一个未公开记录的函数sp_MSforeachtable对数据库中的每个表执行查询,也许可以为您提供帮助:

EXEC sp_MSforeachtable 'SELECT COUNT(*) FROM ?'