我想知道是否有办法杀死一个Microsoft SQL数据库的SQL连接范围。
如果我想杀死一个会话ID,我可以使用kill [session-id]; go; kill [session-id]; go; 。
如果我想杀死所有会话,我可以切换db模式与ALTER DATABASE [DB-NAME] SET SINGLE_USER WITHROLLBACK IMMEDIATE
但是,如果我想要杀死会话ID范围60-100例如,或从一个特定的主机名或特定用户名的所有会话呢? 有一个简单的方法呢? 我没有find与“杀”命令的解决scheme。 有任何想法吗?
我自己实际上不会这样做。 ;)然而。
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
(显然,你会事先把这些脚本放在一边。)