天天看點

SqlServer檢視死鎖的存儲過程

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