我有一个临时表,其中有几个表名,如下所示:
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循环的方法?
答案 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 ?'