Выполнить один и тот же запрос для нескольких таблиц без динамического SQL
Я поддерживаю базу данных SQL для стороннего программного пакета. У них есть много того, что они называют «теневыми таблицами», на самом деле просто таблицы аудита. Это все хорошо, но их система не очищает эти таблицы, поэтому я должен это сделать. Они также добавляют новые «Таблицы теней» без уведомления при каждом обновлении. Старый способ очистки таблиц был с длинным спискомDELETE FROM
заявления, но этот список стал очень длинным и трудно поддерживать.
Чтобы упростить поддержку процесса очистки и автоматически перехватывать новые «теневые таблицы», я написал следующую хранимую процедуру. Хранимая процедура работает, но я бы предпочел найти способ без использования курсора и динамических запросов, так как он будет ежедневно выполняться для множества разных таблиц. Есть ли альтернативный способ сделать это без использования курсора и динамических запросов?
DECLARE @workingTable varchar(128);
DECLARE @sqlText varchar(250);
DECLARE @CheckDate DATETIME = DATEADD(yy, -2, GETDATE());
DECLARE curKey SCROLL CURSOR FOR
SELECT name AS TableName
FROM dataTEST.sys.tables
WHERE (name like '%[_]h' OR name like '%[_]dh')
ORDER BY name
OPEN curKey
WHILE @@fetch_status = 0
BEGIN
FETCH NEXT FROM curKey INTO @workingTable
SET @sqlText = 'DELETE FROM DataTEST.dbo.' + @workingTable + ' WHERE LAST_MOD < ''' + CONVERT(CHAR(10), @CheckDate, 101) + ''';'
--PRINT @sqlText
EXEC (@sqlText)
END
CLOSE curKey
DEALLOCATE curKey