运行 特定 sql 仅当 state_desc 在线时每个数据库

Run specific sql for each DB only when state_desc is ONLINE

我正在尝试创建一个脚本,该脚本将 运行 跨所有数据库并删除特定 table 超过 X 个月的行。该 scipt 正在运行,但为了获得更多 stable 我想在其中添加一些条件。 一个条件是它只会 运行 当数据库有 state_desc 像 '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

就个人而言,我会在 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;