воскресенье, 5 сентября 2010 г.

Убить все процессы

USE [master]
GO

/****** Object: StoredProcedure [dbo].[kill2]  Script Date: 08/27/2008 16:21:40 ******/
IF EXISTS (SELECT * FROM master.dbo.sysobjects WHERE id = OBJECT_ID(N'[kill2]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[kill2]
GO
--Usage1: Kill2 '51-57' --> Kills all the session IDs from 51 to 57
--Usage2: Kill2 '58' --> Kills the session IDs 58
--Usage3: Kill2 '51,56,100,58' --> Kills the session IDs 51,56,100 and 58
--Usage4: Kill2 'DB=MyDatabase' --> Kills all the session IDs that are connected to the database "MyDatabase"



USE master
go
SET concat_null_yields_null OFF
go
CREATE PROCEDURE kill2 @param2 VARCHAR(500)
AS
--declare @param2 varchar(500)
DECLARE @param VARCHAR(500)
DECLARE @startcount INT
DECLARE @killcmd VARCHAR(100)
DECLARE @endcount INT
DECLARE @spid INT
DECLARE @spid2 INT
DECLARE @tempvar VARCHAR(100)
DECLARE @tempvar2 VARCHAR(100)

--set @param2 ='54'
SET @param=REPLACE(@param2,' ','')

IF CHARINDEX('-',@param) <> 0
BEGIN

SELECT @startcount= CONVERT(INT,SUBSTRING(@param,1,CHARINDEX('-',@param)-1))
SELECT @endcount=CONVERT(INT,SUBSTRING(@param,CHARINDEX('-',@param)+1,(LEN(@param)-CHARINDEX('-',@param))))
PRINT 'Killing all SPIDs from ' + CONVERT(VARCHAR(100),@startcount)+' to ' +CONVERT(VARCHAR(100),@endcount)

WHILE @startcount <=@endcount
BEGIN
SET @spid=(SELECT spid FROM master.dbo.sysprocesses WHERE spid=@startcount and spid>50)

IF @spid = @startcount
BEGIN
PRINT 'Killing '+CONVERT(VARCHAR(100),@startcount)
SET @killcmd ='Kill '+CONVERT(VARCHAR(100),@startcount)
EXEC(@killcmd)

END
ELSE
BEGIN
PRINT 'Cannot kill the SPID ' +CONVERT(VARCHAR(100),@startcount) + ' because it does not Exist'
END
SET @startcount=@startcount + 1
END


END


IF CHARINDEX(',',@param) <> 0
BEGIN
SET @tempvar =@param

    WHILE CHARINDEX(',',@tempvar ) <> 0
    BEGIN
    SET @tempvar2=LEFT(@tempvar,CHARINDEX(',',@tempvar)-1)
    SET @spid=(SELECT spid FROM master.dbo.sysprocesses WHERE spid=CONVERT(VARCHAR(100),@tempvar2) and spid>50)

    IF @spid = CONVERT(VARCHAR(100),@tempvar2)
        BEGIN
        PRINT 'Killing '+CONVERT(VARCHAR(100),@tempvar2)
        SET @killcmd='Kill '+CONVERT(VARCHAR(100),@tempvar2)
        EXEC (@killcmd)

        END
        ELSE
        BEGIN
        PRINT 'Cannot kill the SPID ' +CONVERT(VARCHAR(100),@tempvar2) + ' because it does not Exist'
        END

    SET @tempvar =REPLACE(@tempvar,LEFT(@tempvar,CHARINDEX(',',@tempvar)),'')
    END
    SET @spid=(SELECT spid FROM master.dbo.sysprocesses WHERE spid=CONVERT(VARCHAR(100),@tempvar) and spid>50)

    IF @spid = CONVERT(VARCHAR(100),@tempvar)
        BEGIN
        PRINT 'Killing '+CONVERT(VARCHAR(100),@tempvar)
        SET @killcmd='Kill '+CONVERT(VARCHAR(100),@tempvar)
        EXEC (@killcmd)

        END
        ELSE
        BEGIN
        PRINT 'Cannot kill the SPID ' +CONVERT(VARCHAR(100),@tempvar) + ' because it does not Exist'
        END

END


IF CHARINDEX('=',@param2) <>0
BEGIN
PRINT 'Killing all the SPIDs that are connected to the database '+RIGHT(@param2,(LEN(@param2)-3))

DECLARE dbcursor CURSOR forward_only FOR SELECT SPID FROM master.dbo.sysprocesses WHERE DB_NAME(dbid) = RIGHT(@param2,(LEN(@param2)-3))
OPEN dbcursor
FETCH dbcursor INTO @spid
WHILE @@FETCH_STATUS =0
BEGIN
    SET @spid2=(SELECT spid FROM master.dbo.sysprocesses WHERE spid=@spid and spid>50)

    IF @spid = @spid2        BEGIN
        PRINT 'Killing '+CONVERT(VARCHAR(100),@spid2)
        SET @killcmd='Kill '+CONVERT(VARCHAR(100),@spid2)
        EXEC (@killcmd)

        END
        ELSE
        BEGIN
        PRINT 'Cannot kill the SPID ' +CONVERT(VARCHAR(100),@spid2) + ' because it does not Exist'
        END


FETCH dbcursor INTO @spid
END
CLOSE dbcursor
DEALLOCATE dbcursor


END



IF CHARINDEX('-',@param)=0 and CHARINDEX(',',@param) = 0 and CHARINDEX('=',@param)=0
BEGIN
    SET @spid=(SELECT spid FROM master.dbo.sysprocesses WHERE spid=CONVERT(VARCHAR(100),@param) and spid>50)

    IF @spid = CONVERT(VARCHAR(100),@param)
        BEGIN
        PRINT 'Killing '+CONVERT(VARCHAR(100),@param)
        SET @killcmd='Kill '+CONVERT(VARCHAR(100),@param)
        EXEC (@killcmd)

        END
        ELSE
        BEGIN
        PRINT 'Cannot kill the SPID ' +CONVERT(VARCHAR(100),@param) + ' because it does not Exist'
        END


END

go
--kill2 '51'
--go
--kill2 '51-56'
--go
--kill2 '56,57,58,52'
--go
--kill2 'db=AdventureWorks2008'
--kill2 'db=My Database'
--go
--sp_who