SQL Serverに対してDDLなどを実行したいとき、テストなどで実行していたプログラム等の接続が残っているなど、うまく実行が出来ないケースがあるかと思います。
そんな時は以下のようなSQLを実行するように実行したいDDLの最初に記述しておくとよいかもしれません。
declare Disconnect cursor for select [dm_exec_sessions].[session_id] from [sys].[dm_exec_sessions] inner join [sys].[dm_exec_connections] on [dm_exec_sessions].[session_id] = [dm_exec_connections].[session_id] inner join [sys].[databases] on [dm_exec_sessions].[database_id] = [databases].[database_id] where [databases].[name] = '{任意のデータベース名}' -- ここに接続を切りたいデータベースの物理名を記述する declare @Sql as nvarchar(max) declare @SessionId as smallint fetch next from Disconnect into @SessionId while @@FETCH_STATUS = 0 begin set @Sql = 'Kill ' + CAST(@SessionId AS nvarchar(max)) + ';' exec (@Sql) fetch next from Disconnect into @SessionId end close Disconnect deallocate Disconnect
SQL Serverへの接続はセッションという形で保持されています。
セッションの情報は dm_exec_sessions
テーブルから取得出来ます。
各セッションがつないでいるデータベースの情報は dm_exec_connections
にて持っているため、 dm_exec_sessions
と結合してデータベース名を指定します。
あとは取得したセッションのIDを使って、 kill
コマンドで切断することが出来ます。