Как выполнить цикл через все таблицы 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

- Это моя ошибка:

Msg 116, Уровень 16, Состояние 1, Строка 19 В списке выбрать можно указать только одно выражение когда подзапрос не вводится с EXISTS.

Я понимаю, что моя ошибка, вероятно, связано с выбором двух столбцов в строке

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

но я не уверен, как еще убедиться, что я выбираю следующую строку.

П. С. AND @count <2 только для тестирования скриптов.

как я могу пройти через все таблицы?

2 ответов


используйте эту системную хранимую процедуру

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

пример кода

Примечание: этот sp_MSforeachtable является недокументированной хранимой процедурой


может быть, это то, что вы ищете

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