如何遍历所有SQL表?

时间:2014-10-21 21:41:34

标签: sql sql-server loops tsql

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

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,Level 16,State 1,Line 19   当未使用EXISTS引入子查询时,只能在选择列表中指定一个表达式。

我意识到我的错误可能与选择行

中的两列有关
        SET @name = (   SELECT Name, ROW_NUMBER() OVER(ORDER BY Name)
                        FROM sys.tables 
                        WHERE @rn = @count
                     )

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

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

如何遍历所有表?

4 个答案:

答案 0 :(得分:21)

使用此系统存储过程

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

sample code

注意:此sp_MSforeachtable是未记录的存储过程

答案 1 :(得分:10)

也许这就是你要找的东西

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 

答案 2 :(得分:0)

有时在SQL中使用游标会带来风险。下面的SQL查询将遍历选定数据库中的所有表,而无需使用CURSOR。

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语句将在 TEST 数据库中打印所有表。因此,可以使用自己的sql逻辑代替打印表语句,就像您要循环每个表那样,并且 @TableName 将在当前循环中包含表名。

答案 3 :(得分:0)

您可以使用Concatenation如下生成脚本。然后执行脚本。

DECLARE @sqlStmt NVARCHAR(MAX) = ''
SELECT @sqlStmt= CONCAT('SELECT COUNT(*) AS CountOfRows,''',name,''' AS TableName FROM ',name,';',CHAR(13), CHAR(10)) FROM sys.tables
--SELECT @sqlstmt 
EXEC(@sqlStmt)