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