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