如何在没有while循环的sqlserver中进行迭代

如何在没有while循环的sqlserver中进行迭代,sql,sql-server,Sql,Sql Server,我有一个临时表,表名很少,如下所示: Id TableName ------------- 1 TableA 2 TableB 3 TableC 这些表名应该在显示的查询中被替换,并且应该被执行。我可以通过while循环来实现它,但我不想使用while。有没有其他的概念 我有以下SQL语句: SELECT TDU.ColHeader, TDU.ColValues FROM (SELECT ' + @ColumnsCasted +

我有一个临时表,表名很少,如下所示:

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;
SELECT * FROM [TableA]; SELECT * FROM [TableB]; SELECT * FROM [TableC];
@TableName
@columnscated
@columnsupvot
基于存储在临时表中的表名。我使用while循环迭代每个表名,并在语句中替换它


有人能推荐一种不使用while循环的方法吗?

有一个非文档化的函数,用于对数据库中的每个表执行查询,也许它可以帮助您:

EXEC sp_MSforeachtable 'SELECT COUNT(*) FROM ?'

有一个非文档化的函数,用于对数据库中的每个表执行查询,也许它可以帮助您:

EXEC sp_MSforeachtable 'SELECT COUNT(*) FROM ?'

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

-- 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'

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

-- 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'

您是否可以添加一些示例输入,以便使问题更加清晰?没有(可能)基于集合的方法来做您想要做的事情,因此除了使用过程方法(while或cursor)之外,没有其他方法。这样做实际上也没有任何问题。您是否可以添加一些示例输入,以便使问题更加清晰?没有(可能)基于集合的方法来做您想要做的事情,因此除了使用过程方法(while或cursor)外,没有其他方法。这样做实际上也没有任何问题。它在内部使用游标。它在内部使用游标。