2017-05-10 27 views
1

トランスログ・ファイルを1時間ごとにスタンバイ・モードのデータベースDBrestoreにリストアする必要があります。そこで、まずプロセスをすべて終了してからログファイルをデータベースに復元するジョブを作成しましたが、ジョブが失敗することがあります:プロセスID '71'アクティブなプロセスIDではなく、毎回プロセスIDが変化しますそれは失敗する。プロセス私は確信して、それが唯一のアクティブであるプロセスIDを取るにするには、このクエリで確認する必要がありますどのような変更プロセスID 'x'はアクティブなプロセスIDではありません

declare @sql as varchar(20), @spid as int 
select @spid = min(spid) from master..sysprocesses 
where dbid = db_id('DBrestore') 
and spid != @@spid  

while (@spid is not null) 
begin 
print 'Killing process ' + cast(@spid as varchar) + ' ...' 
set @sql = 'kill ' + cast(@spid as varchar) 
exec (@sql) 

select 
    @spid = min(spid) 
from 
    master..sysprocesses 
where 
    dbid = db_id('DBrestore') 
    and spid != @@spid 
end 

を殺すために、このクエリを使用して イム。下記のリンクで提供されるドキュメントには、事前

答えて

3

おかげで、それが「アクティブ」のプロセスは、ステータスを介して捕捉されていることを言及しています。これをwhere条件に追加すると、クエリがアクティブなプロセスに限定されるはずです。

declare @sql as varchar(20), @spid as int 
select @spid = min(spid) from master..sysprocesses 
where dbid = db_id('DBrestore') 
and spid != @@spid  

while (@spid is not null) 
begin 
print 'Killing process ' + cast(@spid as varchar) + ' ...' 
set @sql = 'kill ' + cast(@spid as varchar) 
exec (@sql) 

select 
    @spid = min(spid) 
from 
    master..sysprocesses 
where 
    dbid = db_id('DBrestore') 
    and spid != @@spid 
    and status = 'running' 
end 

https://docs.microsoft.com/en-us/sql/relational-databases/system-compatibility-views/sys-sysprocesses-transact-sql

+0

@maSTAShuFu、あなたのコメントは無用だった原因...その答えはかなり正しいと有効です。説明が不足していますが、それだけで十分なリソースやドキュメントを指し示すことはできます。 – Rahul

+0

@EricHartmanご返信ありがとうございます。私は私の質問でステータスを使用して再試行します – Sql

関連する問題