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
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
-- 找到臨時表的記錄數
SELECT @intCountProperties = COUNT(*),@intCounter = 1
FROM #tmp_lock_who
IF @intCountProperties=0
SELECT '現在沒有阻塞和死鎖資訊' AS message
-- 循環開始
while @intCounter <= @intCountProperties
--取第一條記錄
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
exec master.dbo.sp_who_lock