2015-05-29 21 views
-2

我使用游标来删除一组表。表的数量大约是400.当计数达到105时,执行挂起。请找到以下脚本:如何在使用sqlserver中的游标删除大量表时清除死锁?

DECLARE @TblName NVARCHAR(MAX); 
DECLARE TBL_Cur CURSOR 
FOR (select name from sysobjects 
     where name like 'xxx'); 
OPEN TBL_Cur; 
FETCH NEXT FROM TBL_Cur INTO @TblName 
      WHILE (@@FETCH_STATUS <> -1) 
     BEGIN 
      IF LEN(@TblName) >0 
      BEGIN 
       DECLARE @strsql nvarchar(max) 
      if ('Create_ts' IN (select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where table_name = @TblName)) 
      BEGIN 
        SET @strsql = 'Select count(*) from' + @TblName + ' where DATEDIFF(HOUR,create_ts,getdate())>1' 
        Begin try 
        BEGIN TRAN 
        EXEC sp_executesql @strsql 

        COMMIT TRAN 
        End Try 

        Begin Catch 

        End catch 
      END 
      END 
FETCH NEXT FROM TBL_Cur INTO @TblName 
END 
CLOSE TBL_Cur 
DEALLOCATE TBL_Cur 

在此先感谢您的帮助。

+1

呃,什么?............... –

+2

我不知道你的意思,你的标题提到了我看不到的UPDATE,而你的问题机构提到了DELETE,我也没有看到... –

+0

@Mitch wheat我不清楚你在问什么? – charu

回答

0

我认为查询可以加快速度,如果不是执行字符串操作,而是一次执行它们,那么您将不得不在光标上花费较少的时间。

我认为你想要所有的表名与xxx +他们应该有一个'create_ts'列。修改了一下查询。我的解决方案就像。

DECLARE @tbl Table(tableName nvarchar(MAX) null, stmt nvarchar(MAX) null) 

INSERT INTO @tbl(tablename, stmt) 
SELECT T.TABLE_NAME, 'SELECT count(*) FROM [' + T.TABLE_NAME + '] WHERE 
DATEDIFF(HOUR,create_ts,getdate())>1' 
FROM INFORMATION_SCHEMA.TABLES T 
INNER JOIN INFORMATION_SCHEMA.COLUMNS C ON T.TABLE_NAME = C.TABLE_NAME AND 
T.TABLE_SCHEMA= C.TABLE_SCHEMA 
WHERE T.TABLE_NAME like 'xxx' AND C.COLUMN_NAME = 'Create_ts' 

-- Open cursor and execute each row of @tbl 
-- also instead of executing each row in separate transaction, 
-- put the loop inside transaction and commit only once. 

DECLARE @tableToBeChecked nvarchar(MAX) 

IF NOT exists(SELECT object_name(P.object_id) as LockedTable FROM 
sys.dm_tran_locks AS L INNER JOIN sys.partitions AS P ON 
L.resource_associated_entity_id = p.hobt_id WHERE object_name(P.object_id) 
= @tableToBeChecked) 
BEGIN 
-- table is not locked and can be deleted safely. 
-- still no guarantee that by the time you arrive here the table 
-- would still be unlocked. 
END 
+0

您的剧本非常脆。但它又一次出现同样的问题。 – charu

+0

我认为它与列表中的某个表锁定在一起。你有没有想过如何跳过被锁定的表格 – charu

+0

刚刚修改了代码。现在检查! –