Мне было интересно, есть ли способ убить ряд соединений 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
(Очевидно, эти скрипты у вас будут лежать заранее.)