Выполнить спецификацию c sql для каждой БД, только если state_des c находится в ONLINE - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь создать сценарий, который работал бы во всех БД и удалял строки из указанной c таблицы старше X месяцев. Scipt работает, но для большей стабильности я хотел бы добавить в него некоторые условия. Одно условие состоит в том, что он будет работать только тогда, когда в БД есть state_des c, например «ONLINE», если это не удается, я хотел бы зарегистрировать БД, которая не была обработана.

скрипт:

    declare @result table ( servername         sysname
                      , dbname             sysname
                      , rows_deleted numeric(15, 0)
                      )

insert into @result
exec sp_MSforEachDB
'if ''?'' like ''DB_%'' 
begin
 -- delete all rows older then 13 months
Delete
  from ?..TABLE1
 where timestamp < DATEADD(month, -6, CAST(CURRENT_TIMESTAMP AS DATE));
 -- display result
Select @@ServerName
     , ''?'' as dbname
     , @@rowcount as rows_deleted
end'

select * from @result

1 Ответ

0 голосов
/ 16 июня 2020

Лично я бы использовал курсор над запросом sys.databases с желаемым фильтром, а не использовал бы недокументированную sp_MSforeachdb хранимую процедуру.

Вы можете добавить критерии DATABASEPROPERTYEX к существующим IF оператор для условного выполнения:

DECLARE @result TABLE (
      servername         sysname
    , dbname             sysname
    , rows_deleted numeric(15, 0)
);

INSERT INTO @result
EXEC sp_MSforEachDB
'
if ''?'' like ''DB_%'' AND DATABASEPROPERTYEX(N''?'',''STATUS'') = ''ONLINE'' AND DATABASEPROPERTYEX(N''?'',''Updateability'') = ''READ_WRITE''
BEGIN
 -- delete all rows older then 13 months
DELETE
  FROM [?]..TABLE1
 WHERE timestamp < DATEADD(month, -6, CAST(CURRENT_TIMESTAMP AS DATE));
 -- display result
SELECT @@ServerName
     , ''?'' as dbname
     , @@rowcount as rows_deleted
end
';
SELECT *
FROM @result;
...