One of the databases I work with runs a ton of updates overnight and in the early morning. Now, from time to time I run into a problem where a user has a lock on a table. This usually stems from, as far as I can tell, an MS Access query that is left open on their machines. Since the access query has a lock, I cannot refresh or merge anything into those tables until the user releases the lock. Bad news for anyone wanting fresh data first thing in the morning. What I found as a bit of a nuclear option, but it works great in this situation: Just kill all of the connections to the DB! Here is the script that I found on iMIS Community.
CREATE PROCEDURE [dbo].[sp_KillSpidsByDBName] @dbname sysname = '' AS BEGIN -- check the input database name IF CREATE PROCEDURE [dbo].[sp_KillSpidsByDBName] @dbname sysname = '' AS BEGIN -- check the input database name IF DATALENGTH (@dbname) = 0 OR LOWER (@dbname) = 'master' OR LOWER (@dbname) = 'msdb' RETURN DECLARE @sql VARCHAR (30) DECLARE @rowCtr INT DECLARE @killStmts TABLE (stmt VARCHAR (30)) -- find all the SPIDs for the requested db, and create KILL statements -- for each of them in the @killStmts table variable INSERT INTO @killStmts SELECT 'KILL ' + CONVERT ( VARCHAR (25), spid) FROM master..sysprocesses pr INNER JOIN master..sysdatabases db ON pr.dbid = db. dbid WHERE db.name = @dbname -- iterate through all the rows in @killStmts, executing each statement SELECT @rowCtr = COUNT(1) FROM @killStmts WHILE (@rowCtr > 0) BEGIN SELECT TOP (1) @sql = stmt FROM @killStmts EXEC (@sql) DELETE @killStmts WHERE stmt = @sql SELECT @rowCtr = COUNT (1) FROM @killStmts END END
I simply execute this stored procedure from ANOTHER DATABASE before running the updates. This also works when trying to perform a full restore on a database that people are still pinging for one reason or another. I would not recommend this for use on databases where users are reading and writing. But for reporting only type databases, this should be OK. But use your best judgement!