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

declare @spid  as int
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

-- KILL Process
OPEN spid_cursor

FETCH NEXT FROM spid_cursor
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

CLOSE spid_cursor
DEALLOCATE spid_cursor

GO


 

原理很容易,master.dbo.sysprocesses裡存有目前 process的相關資訊,利用 dbid來做 filter就可以了,接著利用 cursor,一個一個地把 process清除掉
arrow
arrow
    全站熱搜

    Downunder 發表在 痞客邦 留言(0) 人氣()