只有当state_desc为ONLINE时,才能为每个DB运行特定的sql。

问题描述 投票:0回答:1

我想创建一个脚本,在所有的DB中运行,并从一个特定的表中删除超过X个月的记录。这个脚本是可行的,但是为了让它更稳定,我想在其中加入一些条件。其中一个条件是,只有当DB的state_desc为'ONLINE'时,它才会运行,如果失败了,我想记录没有处理的DB。

脚本。

    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
sql-server tsql dynamic-sql
1个回答
0
投票

就个人而言,我会在一个表上使用游标。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;
© www.soinside.com 2019 - 2024. All rights reserved.