使用动态SQL杀死所有用户会话 - exec中的exec

时间:2011-07-09 22:50:15

标签: sql sql-server exec

  

环境:SQL Server 2005/2008

我想使用动态SQL杀死特定数据库上的所有用户连接。我知道其他方法,如将数据库模式改为单/离线等,但想使用动态SQL。

我试图避免游标,while循环以及执行动态SQL时对变量的任何使用。这是我使用sysprocesses的代码:

 
-- Construct KILL SQL
exec ('select ''kill '' + cast(spid as varchar(20)) + '';'' from sys.sysprocesses
    where spid NOT IN (@@spid)
    and spid > 50') 

现在构建单个kill语句之后,我想执行而不声明并使用如下变量。我错过了什么或exec内的执行官不起作用?

  
-- execute KILL SQL
exec ('exec (''select ''''kill '''' + cast(spid as varchar(20)) + '''';'''' from sys.sysprocesses
where spid NOT IN (@@spid)
and spid > 50'')')

我知道一种更好的方式来声明一个变量并按以下方式执行,但如果可以不使用变量,我想在上面工作:

 
-- routine way of doing KILL
declare @dsql nvarchar(max)=''
select @dsql = 'kill ' + cast(spid as varchar(20)) + ';' from sys.sysprocesses
where spid NOT IN (@@spid)
and spid > 50
exec(@dsql)

2 个答案:

答案 0 :(得分:0)

我建议您的上一个版本是最佳解决方案。

答案 1 :(得分:0)

您的解决方案均不限于仅一个数据库。您的代码会杀死所有数据库中的所有用户会话。

declare @dsql nvarchar(max)=''
select @dsql = 'kill ' + cast(spid as varchar(20)) + ';' from sys.sysprocesses
where spid NOT IN (@@spid)
and spid > 50
AND dbid = <your database id>
exec(@dsql)

但是每个代码具有所有这些终止选项的问题将是相同的: 在没有AdminSession的情况下将数据库设置为脱机状态将不会杀死所有可靠的会话。而且我也没有解决方案。