首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何循环遍历所有SQL表?

问如何循环遍历所有SQL表?
EN

Stack Overflow用户
提问于 2014-10-21 21:41:34
回答 3查看 66.7K关注 0票数 19

我们有一个软件,不删除我们不再想要的条目。为了了解我们的服务器中有多少数据正在浪费,并为一次大规模的清理操作做准备,我试图循环遍历所有表,并提取标记为删除的记录。这就是我要做的事:

代码语言:javascript
复制
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

这是我的错误:

Msg 116、级别16、状态1、第19行只有一个表达式可以在select列表中指定,当子查询未被引入时。

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

代码语言:javascript
复制
        SET @name = (   SELECT Name, ROW_NUMBER() OVER(ORDER BY Name)
                        FROM sys.tables 
                        WHERE @rn = @count
                     )

但是,我不知道如何确保我选择下一行。

P.S. AND @count <2只用于脚本测试。

如何循环遍历所有表?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-21 22:01:08

使用此系统存储过程

代码语言:javascript
复制
sp_MSforeachtable @command1="select count(*) from ?"

样本代码

注意:

  • 此sp_MSforeachtable是一个无文档的存储过程。
  • 不支持Azure SQL (以下注释)。
票数 37
EN

Stack Overflow用户

发布于 2014-10-21 22:00:17

也许这就是你要找的

代码语言:javascript
复制
DECLARE @NAME VARCHAR(100)
DECLARE @SQL NVARCHAR(300)

DECLARE CUR CURSOR FOR
  SELECT NAME
  FROM   SYS.TABLES
  WHERE  TYPE = 'U'
         AND SCHEMA_ID = 1

OPEN CUR

FETCH NEXT FROM CUR INTO @NAME

WHILE @@FETCH_STATUS = 0
  BEGIN
      SET @SQL = 'SELECT * FROM WS_LIVE.DBO.'+@NAME+' WHERE GCRECORD IS NOT NULL'

      PRINT @SQL
      EXEC Sp_executesql
        @SQL

      FETCH NEXT FROM CUR INTO @NAME
  END

CLOSE CUR

DEALLOCATE CUR 
票数 24
EN

Stack Overflow用户

发布于 2019-10-28 10:33:53

有时在SQL中使用游标是有风险的。下面的SQL查询将不使用游标遍历所选数据库中的所有表。

代码语言:javascript
复制
USE TEST
Declare @TableName nvarchar(256) 
SET @TableName = ''

WHILE @TableName IS NOT NULL
BEGIN
    SET @TableName = 
    (
        SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
        FROM    INFORMATION_SCHEMA.TABLES
        WHERE       TABLE_TYPE = 'BASE TABLE'
            AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
    )
print @TableName -- Your logic will come here
END
GO

上面的sql语句将打印测试数据库中的所有表。因此,与打印table语句不同,您可以给出自己的sql逻辑,就像循环每个表一样,@TableName将在当前循环中包含表名。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26496864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档