环境: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')
现在构建单独的终止语句后,我想在不声明和使用变量的情况下执行,如下所示。我是否遗漏了某些内容,或者 exec 中的 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)
您的所有解决方案都不仅限于一个数据库。您的代码杀死所有数据库中的所有用户会话。
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 的情况下将数据库设置为脱机不会杀死所有可靠的会话。我对此也没有解决方案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)