第二次重命名表列表后,sp_rename停止工作

时间:2016-06-03 15:50:26

标签: sql sql-server sql-server-2008

我创建了一个脚本来重命名我复制到另一个数据库中的表。但是,当我运行它时,它给出了一个错误,说重命名的表正在使用中。这是它重命名的第二个表。 错误消息"错误:新名称' IPro_ALERT_1604220600'已经被用作对象名称,并且会导致不允许的重复。"

我不确定为什么会出现这个错误,我已经浏览了这个网站和其他地方,我认为我的代码应该可行。关于它是什么/为什么这样做的任何想法?

提前致谢。

重命名表格的代码:

USE [II_to_IIRP]
BEGIN
SET NOCOUNT ON;

    DECLARE @table_name SYSNAME
    DECLARE @table_part SYSNAME

    DECLARE comp_cursor cursor FOR
    SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_TYPE = 'BASE TABLE'
    AND TABLE_NAME  LIKE '%_1604220600'  
    ORDER BY TABLE_NAME

OPEN COMP_CURSOR

    FETCH NEXT FROM COMP_CURSOR INTO @table_name
    SET @table_part = 'IPro_' + @table_name 
    WHILE (@@fetch_status = 0 and @@error = 0 )
BEGIN
    PRINT 'Changing table Name '+@table_name
    EXEC sp_rename @table_name, @table_part
    PRINT 'Done Changing table '+@table_name
    SELECT 'drop table dbo.'+@table_name where @table_name <> @table_part
    FETCH NEXT FROM COMP_CURSOR INTO @table_name
    PRINT 'Getting next table ' + @table_name
END
CLOSE COMP_CURSOR
DEALLOCATE COMP_CURSOR
END;

2 个答案:

答案 0 :(得分:0)

可能是因为您正在修改光标正在读取的数据。尝试将光标中的数据插入临时表中,然后将此表用作光标。

DECLARE @table_name SYSNAME
    DECLARE @table_part SYSNAME

     SELECT TABLE_NAME 
     INTO #TEMPTABLES
     FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_TYPE = 'BASE TABLE'
    AND TABLE_NAME  LIKE '%_1604220600'  
    ORDER BY TABLE_NAME

    DECLARE comp_cursor cursor FOR
    SELECT TABLE_NAME FROM #TEMPTABLES

答案 1 :(得分:0)

错误实际上非常清楚。您正在尝试将表重命名为已存在的名称。 你忘了包括:

SET @table_part = 'IPro_' + @table_name 

在游标循环中,因此您将重命名下一个与前一个名称相同的表。