一尘不染

如何遍历所有SQL表?

sql

我们有一个软件不会删除不再需要的条目。为了了解服务器中有多少数据正在浪费,并准备进行大型清理操作,我试图遍历所有表并拉出标记为删除的记录。这就是我正在使用的:

DECLARE @total INT
DECLARE @count INT
DECLARE @name NVARCHAR(25)
DECLARE @rn INT

SET @total = (SELECT COUNT(Name) FROM sys.tables)
SET @count = 1
SET @rn = (SELECT ROW_NUMBER() OVER(ORDER BY Name) FROM sys.tables)

WHILE @count <= @total AND @count < 2
    BEGIN
        SET @name = (   SELECT Name, ROW_NUMBER() OVER(ORDER BY Name)
                        FROM sys.tables 
                        WHERE @rn = @count
                     )

        EXEC('SELECT * FROM WS_Live.dbo.' + @name + ' WHERE GCRecord IS NOT NULL')
        SET @count += 1         
    END

这是我的错误:

消息116,级别16,状态1,行19当未将EXISTS引入子查询时,只能在选择列表中指定一个表达式。

我意识到我的错误可能与选择该行中的两列有关

        SET @name = (   SELECT Name, ROW_NUMBER() OVER(ORDER BY Name)
                        FROM sys.tables 
                        WHERE @rn = @count
                     )

但是,我不确定如何才能确保选择下一行。

PSAND @count <2仅用于脚本测试。

如何遍历所有表?


阅读 231

收藏
2021-03-10

共1个答案

一尘不染

使用此系统存储过程

sp_MSforeachtable @command1="select count(*) from ?"

样例代码

笔记:

  • sp_MSforeachtable是一个未记录的存储过程。
  • 不支持Azure SQL(下面的评论)。
2021-03-10