您的位置:首页 > 数据库

SqlServer查看死锁的存储过程

2012-06-01 10:20 447 查看
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[sp_who_lock]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
DROP PROCEDURE [dbo].[sp_who_lock]
GO

USE master
GO
CREATE PROCEDURE sp_who_lock
AS
BEGIN
DECLARE @spid INT,@bl INT,
@intTransactionCountOnEntry INT,
@intRowcount INT,
@intCountProperties INT,
@intCounter INT

CREATE TABLE #tmp_lock_who (
id INT IDENTITY(1,1),
spid SMALLINT,
bl SMALLINT)

IF @@ERROR<>0 RETURN @@ERROR

INSERT INTO #tmp_lock_who(spid,bl) SELECT 0 ,blocked
FROM (SELECT * FROM sysprocesses WHERE blocked>0 ) a
WHERE NOT EXISTS(SELECT * FROM (SELECT * FROM sysprocesses WHERE blocked>0 ) b
WHERE a.blocked=spid)
UNION SELECT spid,blocked FROM sysprocesses WHERE blocked>0

IF @@ERROR<>0 RETURN @@ERROR

-- 找到临时表的记录数
SELECT @intCountProperties = COUNT(*),@intCounter = 1
FROM #tmp_lock_who

IF @@ERROR<>0 RETURN @@ERROR

IF @intCountProperties=0
SELECT '现在没有阻塞和死锁信息' AS message

-- 循环开始
while @intCounter <= @intCountProperties
BEGIN
--取第一条记录
SELECT @spid = spid,@bl = bl
FROM #tmp_lock_who WHERE Id = @intCounter
BEGIN
IF @spid =0
SELECT '引起数据库死锁的是: '+ CAST(@bl AS VARCHAR(10)) + '进程号,其执行的SQL语法如下'
ELSE
SELECT '进程号SPID:'+ CAST(@spid AS VARCHAR(10))+ '被' + '进程号SPID:'+ CAST(@bl AS VARCHAR(10)) +'阻塞,其当前进程执行的SQL语法如下'
DBCC INPUTBUFFER (@bl )
END

--循环指针下移
SET @intCounter = @intCounter + 1
END

DROP TABLE #tmp_lock_who

RETURN 0
END

sp_who_lock


sqlserver2000下测试通过
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: