close
<原載 20060724>
SQL Server的 DB Detach & Attach功能,讓 DB的複製或搬移變得十分容易,唯一要注意的是,Detach之前,不能有任何的 process存在,如果利用 SSMS進行 Detach時,遇到 DB上還有 process,則會出現警告的 message,我們可以選擇 drop process來清除,達到 Detach DB的目的。問題來了,如果 Detach DB是固定的工作,是在無人介入的情形進行,那麼該如何清除 process呢?
清除 process的指令大家都知道,就是 KILL ,因此我們只要知道目前有哪些 process在該 DB上就可以了,於是我寫了一個 Stored Procedure來達成這個目的:
create procedure dbo.usp_ETL_KillProcessOnDB
@db_name varchar(50) -- DB Name
AS
@db_name varchar(50) -- DB Name
AS
declare @spid as int
declare @sqlcmd as nvarchar(50)
declare @sqlcmd as nvarchar(50)
-- Get spid on DB
DECLARE spid_cursor CURSOR FOR
select spid
from master.dbo.sysprocesses
where dbid <> 0 and db_name(dbid) = @db_name
order by spid
DECLARE spid_cursor CURSOR FOR
select spid
from master.dbo.sysprocesses
where dbid <> 0 and db_name(dbid) = @db_name
order by spid
-- KILL Process
OPEN spid_cursor
OPEN spid_cursor
FETCH NEXT FROM spid_cursor
INTO @spid
INTO @spid
WHILE @@FETCH_STATUS = 0
BEGIN
set @sqlcmd = 'KILL '+STR(@spid)
PRINT @sqlcmd
exec sp_executesql @sqlcmd
FETCH NEXT FROM spid_cursor
INTO @spid
END
BEGIN
set @sqlcmd = 'KILL '+STR(@spid)
PRINT @sqlcmd
exec sp_executesql @sqlcmd
FETCH NEXT FROM spid_cursor
INTO @spid
END
CLOSE spid_cursor
DEALLOCATE spid_cursor
DEALLOCATE spid_cursor
GO
原理很容易,master.dbo.sysprocesses裡存有目前 process的相關資訊,利用 dbid來做 filter就可以了,接著利用 cursor,一個一個地把 process清除掉
全站熱搜