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