2011-07-09 57 views
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) 

+1

爲什麼這麼多的約束,像沒有變量? –

+0

爲什麼你想避免更簡單的解決方案:ALTER DATABASE db SET SINGLE_USER WITH ROLLBACK IMMEDIATE;? –

+0

@Aaron ..我最初的問題是 - 爲什麼我不允許在exec中執行exec?上面的例子只是這個想法的一個小實現...我完全同意我會去解決這個問題的任何其他簡單的解決方案...你能告訴我爲什麼第二個查詢不起作用嗎? – Ram

回答

0

我建議你最後的版本是最好的解決方案。