⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 p_fetchlockmsg.sql

📁 快捷获取SQLSERVER进程锁信息
💻 SQL
字号:
IF EXISTS (SELECT * FROM SYSOBJECTS WHERE ID = OBJECT_ID(N'[DBO].[P_FETCHLOCKMSG]') AND OBJECTPROPERTY(ID, N'ISPROCEDURE') = 1)
    DROP PROCEDURE [DBO].[P_FETCHLOCKMSG]
GO
/*************************************************************************************
名称 P_FETCHLOCKMSG
概要说明
    中文名称:检取数据库死锁信息
    用    途: 用于查询发生死锁的进程,数据库,表及操作SQL语句
    数 据 库:
语法信息
    输入参数:
        
      
    输出参数:
       
    调用举例:
			EXEC P_FETCHLOCKMSG
        
外部联系
    上级调用:
    下级调用: 
    输 入 表:
    输 出 表:无
功能修订
    简要说明:如果为表则返回表结构,如果是过程则返回过程结构

    修订记录:     
			2007-08-14	林加在	创建
************************************************************************************ */
GO
CREATE PROCEDURE P_FETCHLOCKMSG
WITH ENCRYPTION
AS
BEGIN
    SET NOCOUNT ON
    --建立进程表
    IF OBJECT_ID('#TABLE_WHO') IS NOT NULL DROP TABLE #TABLE_WHO

    CREATE TABLE #TABLE_WHO(
        SPID INTEGER,
        ECID INTEGER,
        STATUS VARCHAR(20),
        LOGINNAME VARCHAR(50),
        HOSTNAME VARCHAR(50),
        BLK INTEGER,
        DBNAME VARCHAR(50),
        CMD VARCHAR(40)
    )

    --生成进程数据
    INSERT INTO #TABLE_WHO EXEC SP_WHO

    --查出死锁进程
    --SELECT * FROM #TABLE_WHO WHERE BLK>0

    --找出发生锁定的数据库及表
    IF OBJECT_ID('#TABLE_LOCK') IS NOT NULL DROP TABLE #TABLE_LOCK
    CREATE TABLE #TABLE_LOCK(
        SPID INTEGER,
        DBID INTEGER,
        OBJID INTEGER,
        INTID INTEGER,
        TYPE VARCHAR(10),
        RESOURCE VARCHAR(50),
        MODE VARCHAR(10),
        STATUS VARCHAR(20)
    )
    INSERT INTO #TABLE_LOCK EXEC SP_LOCK

    IF OBJECT_ID('#TMP_TABLENAME') IS NOT NULL DROP TABLE #TMP_TABLENAME
    CREATE TABLE #TMP_TABLENAME(
        TABLENAME VARCHAR(40)
    )
    IF OBJECT_ID('#TMP_INPUTSQL') IS NOT NULL DROP TABLE #TMP_INPUTSQL
    CREATE TABLE #TMP_INPUTSQL(
        EVENTTYPE VARCHAR(40),
        PARAMETERS INTEGER,
        EVENTINFO VARCHAR(5000)
    )
    DECLARE @SPID INTEGER,@BLK INT,@DBID INT,@OBJID INT,@TABLE VARCHAR(40),@DBNAME VARCHAR(30),@SQL VARCHAR(5000),@BLK_SQL VARCHAR(5000)

    SELECT TOP 0 @DBNAME 被锁数据库,@TABLE 被锁表名,@SPID 被锁进程号,@SQL 被锁操作语句,@BLK 主锁进程号,@BLK_SQL 主锁操作未次语句,0 是否为锁根源进程 INTO #TMP_RESULT
    DECLARE CURROW CURSOR LOCAL FOR SELECT SPID,BLK FROM #TABLE_WHO WHERE BLK>0
    OPEN CURROW
    FETCH CURROW INTO @SPID,@BLK
    WHILE @@FETCH_STATUS=0
    BEGIN
        SELECT @DBID=DBID,@OBJID=OBJID FROM #TABLE_LOCK WHERE STATUS='WAIT' AND SPID=@SPID
        SELECT @DBNAME=NAME FROM MASTER..SYSDATABASES WHERE DBID=@DBID
        
        TRUNCATE TABLE #TMP_TABLENAME
        EXEC ('INSERT INTO #TMP_TABLENAME SELECT NAME FROM '+@DBNAME+'..SYSOBJECTS WHERE ID='+@OBJID)
        SELECT @TABLE=TABLENAME FROM #TMP_TABLENAME
        
        
        TRUNCATE TABLE #TMP_INPUTSQL
        INSERT INTO #TMP_INPUTSQL EXEC ('DBCC INPUTBUFFER('+@SPID+')')
        SELECT @SQL=EVENTINFO FROM #TMP_INPUTSQL
        TRUNCATE TABLE #TMP_INPUTSQL
        INSERT INTO #TMP_INPUTSQL EXEC ('DBCC INPUTBUFFER('+@BLK+')')
        SELECT @BLK_SQL=EVENTINFO FROM #TMP_INPUTSQL

        PRINT '**********被锁数据库**********' + CHAR(10)+@DBNAME
        PRINT '***********被锁表名***********' + CHAR(10) + @TABLE
        PRINT '**********被锁进程号**********' + CHAR(10) + CONVERT(VARCHAR(10),@SPID)
        PRINT '*********被锁操作语句*********' + CHAR(10) + @SQL
        PRINT '**********主锁进程号**********' + CHAR(10) + CONVERT(VARCHAR(10),@BLK)
        PRINT '*********主锁操作语句*********' + CHAR(10) + @BLK_SQL

        INSERT INTO #TMP_RESULT
        SELECT @DBNAME 被锁数据库,@TABLE 被锁表名,@SPID 被锁进程号,@SQL 被锁操作语句,@BLK 主锁进程号,@BLK_SQL 主锁操作未次语句,0
        FETCH CURROW INTO @SPID,@BLK
    END
    update #TMP_RESULT
    set 是否为锁根源进程=1
    where 主锁进程号 not in (select 被锁进程号 from #TMP_RESULT)

    SELECT * FROM #TMP_RESULT order by 主锁进程号,被锁进程号

    DROP TABLE #TABLE_WHO
    DROP TABLE #TABLE_LOCK
    DROP TABLE #TMP_INPUTSQL
    DROP TABLE #TMP_TABLENAME
    DROP TABLE #TMP_RESULT
    SET NOCOUNT OFF
END
GO

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -