查询重命名表

时间:2013-04-23 14:09:20

标签: tsql sql-server-2005

在SQL Server 2005中,我希望使用通配符重命名很多表, 例如,表名是:

OrderItem
OrderItems
OrderItemss

我希望将它们重命名为:

OrderItem2
OrderItems2
OrderItemss2

这可以使用通配符完成,所以我不必指定完整的表名吗?感谢。

4 个答案:

答案 0 :(得分:2)

您可以使用系统表选择与您的模式匹配的所有表名称,例如'OrderItem%',或更复杂。然后使用动态sql使用exec SP_RENAME 'old_name' 'new_name'更新名称。

但是,这不会对查询表的存储过程生效。重命名完成后,需要重新编译这些存储过程。

解决方案Sql

好的,这是整个代码。它基于表名以“OrderItem”开头,并且它们都具有后缀为“2”的原始名称。在重命名之前,我创建了一个包含找到的表的表变量。如果您“取消注释”select语句并且只执行该语句,您可以看到选择要重命名的表以及它们将被重命名的内容。 注意我只是从dbo架构中选择表格。

declare @OldTableName nvarchar(max)
declare @NewTableName nvarchar(max)
declare @SqlStmt nvarchar(max)

declare @Tables table
(
    OldTableName nvarchar(max),
    NewTableName nvarchar(max)
)

insert into @Tables (OldTableName, NewTableName)
select
    name as OldTableName ,
    name + '2' as NewTableName
from sys.tables
where name like 'OrderItem%'
    and schema_id = SCHEMA_ID('dbo')

-- select * from @Tables

declare cur cursor for
select OldTableName,
NewTableName
from @Tables

open cur
while (1=1)
begin

    fetch next from cur into @OldTableName, @NewTableName

    if @@FETCH_STATUS <> 0
        break

    set @SqlStmt = N'sp_rename ''' + @OldTableName + ''', ''' + @NewTableName + ''''

    exec sp_executesql @SqlStmt

end

close cur
deallocate cur

NEW 24apr2013

选择包含架构名称的语句,而不仅仅是查找dbo架构

select
    s.name + '.' + t.name as OldTableName,
    t.name + '2' as NewTableName
from sys.tables as t
inner join sys.schemas as s on t.schema_id = s.schema_id
where t.name like 'OrderItem%'

<强>加

sys.tables中查找所有表(请记住只选择要重命名的模式中的那些表)。将名称插入临时表以及您为其提供的新表名称,然后迭代每个名称,生成一个sql字符串,调用sp_rename并使用exec sp_executesql 'SQL STMT'进行实际操作执行。

答案 1 :(得分:1)

就是这么简单:

DECLARE @SQL nvarchar(max);

SELECT
   @SQL = Coalesce(@SQL + Char(13) + Char(10), '') + 'EXEC sp_rename '''
   + Replace(QuoteName(TABLE_SCHEMA) + '.' + QuoteName(TABLE_NAME), '''', '''''')
   + ''', ''' + Replace(TABLE_NAME + '2', '''', '''''') + ''';'
FROM INFORMATION_SCHEMA.TABLES T
WHERE
   T.TABLE_TYPE = 'BASE TABLE'
   AND T.TABLE_NAME LIKE 'OrderItem%'
;

EXEC (@SQL);

答案 2 :(得分:0)

您可以通过此查询获取所需的所有用户表的列表:

select name from sysobjects where type = 'U' and name like 'user%'

然后使用sp_executesql和游标查询结果来执行动态SQL(MSDN)以执行实际重命名。

希望有所帮助。

答案 3 :(得分:-1)

首先,所有人都找到数据库中的表数(我有3个) 并将此代码放在存储过程中,也可以输入参数!!

 `alter procedure [dbo].[changetableName]
  as
  declare @sql varchar(8000), @table varchar(1000), @oldTable varchar(1000),  
  @newTable     
  varchar(1000);
  declare @Inc integer;
  set @Inc=1;

  set @oldTable = '%OrderItem%'
  set @newTable = 'OrderItem_n'

  while exists(SELECT object_id, t.name AS table_name FROM sys.tables AS t where
  t.name Like @oldTable) and (@Inc<=3)
   begin

    select @table = name from sys.tables 
   where object_id in(select object_id from sys.tables as t where t.name like 
        @oldTable )

 set @sql = 'sp_rename ' + @table + ' , ' + @newTable + CONVERT(varchar(2),@Inc) 

    exec(@sql)
   SET @Inc = @Inc + 1;
  select @sql
  end`