2
環境:我想的SQL Server 2005/2008殺死所有的用戶會話 - EXEC EXEC內
殺使用動態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之後。我是否缺少某些東西,或者執行內部的某個執行不起作用?
-- 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)
爲什麼這麼多的約束,像沒有變量? –
爲什麼你想避免更簡單的解決方案:ALTER DATABASE db SET SINGLE_USER WITH ROLLBACK IMMEDIATE;? –
@Aaron ..我最初的問題是 - 爲什麼我不允許在exec中執行exec?上面的例子只是這個想法的一個小實現...我完全同意我會去解決這個問題的任何其他簡單的解決方案...你能告訴我爲什麼第二個查詢不起作用嗎? – Ram