Chinaunix首页 | 论坛 | 博客
  • 博客访问: 543810
  • 博文数量: 704
  • 博客积分: 39800
  • 博客等级: 大将
  • 技术积分: 4950
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-15 13:32
文章分类

全部博文(704)

文章存档

2011年(1)

2008年(703)

我的朋友

分类:

2008-10-15 13:44:08

        REVISIONS
        DATE DEVELOPER DESCRIPTION OF REVISION VERSION
================================================================
        05/05/2005 Omri Bahat Initial release 1.00
================================================================
        Copyright ?SQL Fs Solutions, . All rights reserved.
        This code may be used at no charge as long as this copyright notice is not removed.
===============================================================*/
        DECLARE @MaxAttemptsToKillEachUserProcess INT
        DECLARE @CurrentAttempts INT
        DECLARE @ServerName NVARCHAR(128)
        DECLARE @DatabaseName NVARCHAR(128)
        DECLARE @SQLCommand NVARCHAR(128)
        DECLARE @SPID INT
        DECLARE @LoginName NVARCHAR(128)
        SET NOCOUNT ON
        SET @MaxAttemptsToKillEachUserProcess = 3
        -- 得到和数据库名称
        SET @ServerName = CAST(ISNULL(SERVERPROPERTY('ServerName'), 'Unknown') AS SYSNAME)
        -- 该表记录用户进程标识.
        IF OBJECT_ID('tempdb..#tblUserProcesses', 'U') IS NOT NULL
        DROP TABLE #tblUserProcesses
        CREATE TABLE #tblUserProcesses (
        SPID INT,
        ECID INT,
        Status NVARCHAR(256),
        LoginName NVARCHAR(128),
        HostName NVARCHAR(128),
        BlockedBy NVARCHAR(128),
        DatabaseName NVARCHAR(128),
        Command NVARCHAR(256))
        INSERT INTO #tblUserProcesses
        EXEC SP_WHO
        DELETE FROM #tblUserProcesses
        WHERE SPID <= 50 OR SPID = @@SPID
        WHILE EXISTS(SELECT * FROM #tblUserProcesses WITH (NOLOCK))
        BEGIN
        SET @SQLCommand = NULL
        SET @SPID = NULL
        SET @LoginName = NULL
        SET @DatabaseName = NULL
        SELECT TOP 1 @SQLCommand = 'KILL ' + CAST(SPID AS NVARCHAR(32)),
        @SPID = SPID,
        @LoginName = ISNULL(LoginName, 'NA'),
        @DatabaseName = DatabaseName
        FROM #tblUserProcesses WITH (NOLOCK)
        SET @CurrentAttempts = 0
        WHILE @CurrentAttempts <= @MaxAttemptsToKillEachUserProcess
        BEGIN
        EXEC(@SQLCommand)
        IF @@ERROR <> 0
        BEGIN
        PRINT(N'Error killing process ' + CAST(@SPID AS VARCHAR(32)) + N', of login ' + @LoginName
        + N', on database ' + @DatabaseName
        + N'. The process was probably terminated by the user.')
        BREAK
        END
        -- 清除必要的表
        WAITFOR DELAY '00:00:03'
        -- 确认进程真正终止
        INSERT INTO #tblUserProcesses
        EXEC SP_WHO @SPID
        IF @@ROWCOUNT = 0
        BREAK
        ELSE
        SET @CurrentAttempts = @CurrentAttempts + 1
        END
        IF @CurrentAttempts > @MaxAttemptsToKillEachUserProcess
        BEGIN
        PRINT(N'The number of attempts to kill process ' + CAST(@SPID AS VARCHAR(32)) + N', of login ' + @LoginName
        + N', on database ' + @DatabaseName + N' exceeded the maximum number of retry attempts. Script is aborting.')
        RETURN
        END
        DELETE FROM #tblUserProcesses
        INSERT INTO #tblUserProcesses
        EXEC SP_WHO
        DELETE FROM #tblUserProcesses
        WHERE SPID <= 50 OR SPID = @@SPID
        END
        GO


--------------------next---------------------

阅读(349) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~