0

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

OrderItem
OrderItems
OrderItemss

我希望将它们重命名为:

OrderItem2
OrderItems2
OrderItemss2

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

4

4 回答 4

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

新 2013 年 4 月 24 日

包含架构名称且不仅在dbo架构中查找的 Select 语句

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'来进行实际执行。

于 2013-04-23T14:16:41.380 回答
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);
于 2013-06-21T21:40:32.937 回答
0

您可以通过以下查询获取所有用户表的列表,这些表按您需要的内容过滤:

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

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

希望有帮助。

于 2013-04-23T14:20:12.457 回答
-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`
于 2013-04-23T16:11:07.517 回答