USE MASTER GO IF OBJECT_ID('sp_lock2') IS NOT NULL DROP PROC sp_lock2
GO CREATE PROCEDURE sp_lock2 @spid1 int = NULL, @spid2 int = NULL as
set nocount on
declare @objid int, @indid int, @dbid int, @string Nvarchar(255)
CREATE TABLE #locktable ( spid smallint ,loginname nvarchar(20) ,hostname nvarchar(30) ,dbid int ,dbname nvarchar(20) ,ObjOwner nvarchar(128) ,objId int ,ObjName nvarchar(128) ,IndId int ,IndName nvarchar(128) ,Type nvarchar(4) ,Resource nvarchar(16) ,Mode nvarchar(8) ,Status nvarchar(5) )
if @spid1 is not NULL begin INSERT #locktable ( spid ,loginname ,hostname ,dbid ,dbname ,ObjOwner ,objId ,ObjName ,IndId ,IndName ,Type ,Resource ,Mode ,Status ) select convert (smallint, l.req_spid) ,coalesce(substring (s.loginame, 1, 20),'') ,coalesce(substring (s.hostname, 1, 30),'') ,l.rsc_dbid ,substring (db_name(l.rsc_dbid), 1, 20) ,'' ,l.rsc_objid ,'' ,l.rsc_indid ,'' ,substring (v.name, 1, 4) ,substring (l.rsc_text, 1, 16) ,substring (u.name, 1, 8) ,substring (x.name, 1, 5) from master.dbo.syslockinfo l, master.dbo.spt_values v, master.dbo.spt_values x, master.dbo.spt_values u, master.dbo.sysprocesses s where l.rsc_type = v.number and v.type = 'LR' and l.req_status = x.number and x.type = 'LS' and l.req_mode + 1 = u.number and u.type = 'L' and req_spid in (@spid1, @spid2) and req_spid = s.spid end
else begin INSERT #locktable ( spid ,loginname ,hostname ,dbid ,dbname ,ObjOwner ,objId ,ObjName ,IndId ,IndName ,Type ,Resource ,Mode ,Status ) select convert (smallint, l.req_spid) ,coalesce(substring (s.loginame, 1, 20),'') ,coalesce(substring (s.hostname, 1, 30),'') ,l.rsc_dbid ,substring (db_name(l.rsc_dbid), 1, 20) ,'' ,l.rsc_objid ,'' ,l.rsc_indid ,'' ,substring (v.name, 1, 4) ,substring (l.rsc_text, 1, 16) ,substring (u.name, 1, 8) ,substring (x.name, 1, 5) from master.dbo.syslockinfo l, master.dbo.spt_values v, master.dbo.spt_values x, master.dbo.spt_values u, master.dbo.sysprocesses s where l.rsc_type = v.number and v.type = 'LR' and l.req_status = x.number and x.type = 'LS' and l.req_mode + 1 = u.number and u.type = 'L' and req_spid = s.spid order by spID END DECLARE lock_cursor CURSOR FOR SELECT dbid, ObjId, IndId FROM #locktable WHERE Type <>'DB' and Type <> 'FIL'
OPEN lock_cursor FETCH NEXT FROM lock_cursor INTO @dbid, @ObjId, @IndId WHILE @@FETCH_STATUS = 0 BEGIN
SELECT @string = 'USE ' + db_name(@dbid) + char(13) + 'update #locktable set ObjName = name, ObjOwner = USER_NAME(uid)' + ' from sysobjects where id = ' + convert(varchar(32),@objid) + ' and ObjId = ' + convert(varchar(32),@objid) + ' and dbid = ' + convert(varchar(32),@dbId)
EXECUTE (@string)
SELECT @string = 'USE ' + db_name(@dbid) + char(13) + 'update #locktable set IndName = i.name from sysindexes i ' + ' where i.id = ' + convert(varchar(32),@objid) + ' and i.indid = ' + convert(varchar(32),@indid) + ' and ObjId = ' + convert(varchar(32),@objid) + ' and dbid = ' + convert(varchar(32),@dbId) + ' and #locktable.indid = ' + convert(varchar(32),@indid)
EXECUTE (@string)
FETCH NEXT FROM lock_cursor INTO @dbid, @ObjId, @IndId END CLOSE lock_cursor DEALLOCATE lock_cursor
SELECT * FROM #locktable return (0)
GO |