查詢數據庫鎖表信息

sp_lockinfo ctrl+1

/*******************************************
 * 查詢數據庫鎖表信息
 *******************************************/
CREATE PROC [dbo].[sp_lockinfo]
@kill_lock_spid BIT = 0,--是否殺掉死鎖的進程  1 殺掉 0 僅顯示
@show_spid_if_nolock BIT = 0 --如果沒有死鎖的進程,是否顯示正常的 1 顯示 0 不顯示
AS
SET NOCOUNT ON 
DECLARE @count INT,
@s NVARCHAR(3000),
@i INT 
SELECT id= IDENTITY(INT,1,1),標誌,
進程ID=spid,線程ID=kpid,阻塞進程ID=blocked,數據庫ID=dbid,
數據庫名=db_name(dbid),用戶ID=uid,用戶名=loginame,累計CPU時間=cpu,
登陸時間=login_time,打開事物數=open_tran,進程狀態=status,
工作站名=hostname,應用程序名=program_name,工作站進程ID=hostprocess,
域名=nt_domain,網卡地址=net_address
INTO #t FROM (
    SELECT 標誌='死鎖的進程',
    spid,kpid,a.blocked,dbid,uid,loginame,cpu,login_time,open_tran,STATUS,hostname,program_name,hostprocess,nt_domain,net_address,
    s1=a.spid,s2=0
    FROM MASTER..sysprocesses a JOIN(
        SELECT blocked FROM MASTER..sysprocesses GROUP BY blocked
    ) b ON a.spid = b.blocked WHERE a.blocked = 0
    UNION ALL 
    SELECT '|_被鎖進程_>',
    spid,kpid,blocked,dbid,uid,loginame,cpu,login_time,open_tran,STATUS,hostname,program_name,hostprocess,nt_domain,net_address,
    s1=blocked,s2=1
    FROM [master]..sysprocesses a WHERE blocked <> 0 
) a ORDER BY s1,s2

SELECT @count=@@ROWCOUNT,@i = 1 
IF @count = 0 AND @show_spid_if_nolock = 1 
BEGIN
    INSERT INTO #t
    SELECT 標誌='正常的進程',
    spid,kpid,blocked,dbid,DB_NAME(dbid),uid,loginame,cpu,login_time,open_tran,STATUS,hostname,program_name,hostprocess,nt_domain,net_address
    FROM master..sysprocesses
    SET @count = @@ROWCOUNT
END 

--IF @count > 1 
    CREATE TABLE #t1(id INT IDENTITY(1,1),a NVARCHAR(30),b INT ,eventinfo NVARCHAR(4000))
IF @kill_lock_spid = 1 
    BEGIN
        DECLARE @spid VARCHAR(50),@標誌 varchar(50)
        WHILE @i <= @count
        BEGIN
            SELECT @spid = 進程ID,@標誌 = 標誌 from #t where id = @i
            INSERT #t1 EXEC ('dbcc inputbuffer('+@spid+')')
            IF @@ROWCOUNT = 0  INSERT #t1(a) VALUES(NULL)
            IF @標誌='死鎖的進程' exec('kill '+@spid)
            SET @i= @i + 1 
        END
    END
ELSE
    WHILE @i <= @count
    BEGIN
        SELECT @s = 'dbcc inputbuffer('+CAST(進程ID as VARCHAR)+')'  from #t where id = @i 
        INSERT #t1 EXEC (@s)
        IF @@ROWCOUNT = 0 INSERT #t1(a) VALUES(NULL)
        SET @i = @i + 1 
    END
    
SELECT a.*,c.client_net_address,進程的SQL語句=b.eventinfo
FROM #t a JOIN #t1 b ON a.id = b.id join sys.dm_exec_connections c on a.進程ID = c.session_id
ORDER BY 進程id
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章