Назад | Перейти на главную страницу

Есть ли способ убить ряд идентификаторов сеансов (соединений) на сервере ms sql?

Мне было интересно, есть ли способ убить ряд соединений SQL в базе данных Microsoft SQL.

Если я хочу убить один идентификатор сеанса, я могу использовать kill [session-id]; go;.

Если я хочу убить все сеансы, я могу переключить режим db с помощью ALTER DATABASE [DB-NAME] SET SINGLE_USER WITHROLLBACK IMMEDIATE

Но что, если я хочу уничтожить диапазон идентификаторов сеансов 60-100, например, или все сеансы с определенного имени хоста или определенного имени пользователя? Есть ли для этого простой способ? Я не нашел решения с командой "убить". Любые идеи?

Я бы сам этого не делал. ;) Тем не мение.

Declare @procid int,
        @SQL nvarchar(max)


SET @procid=60
WHILE @procid < 100
BEGIN
    set @SQL='kill ' + CONVERT(nvarchar,@procid)
    EXEC SP_EXECUTESQL @SQL
    SET @procid=@procid+1
END

Что касается процессов с определенного имени хоста или имени пользователя:

DECLARE @Table TABLE(
        SPID INT,
        Status VARCHAR(MAX),
        LOGIN VARCHAR(MAX),
        HostName VARCHAR(MAX),
        BlkBy VARCHAR(MAX),
        DBName VARCHAR(MAX),
        Command VARCHAR(MAX),
        CPUTime INT,
        DiskIO INT,
        LastBatch VARCHAR(MAX),
        ProgramName VARCHAR(MAX),
        SPID_1 INT,
        REQUESTID INT
)

Declare @SQL nvarchar(max),
        @spid int

INSERT INTO @Table EXEC sp_who2

SELECT  @spid = min(SPID) FROM @Table WHERE HostName/Login = 'Whatever'

while @spid is not null

BEGIN
    set @SQL='kill ' + convert(nvarchar,@spid)
    EXEC SP_EXECUTESQL @SQL
    SELECT  @spid = min(SPID) FROM @Table WHERE HostName/Login = 'Whatever' and spid > @spid            
END

(Очевидно, эти скрипты у вас будут лежать заранее.)