运行 特定 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;
我正在尝试创建一个脚本,该脚本将 运行 跨所有数据库并删除特定 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;