重命名多个表

Posted

技术标签:

【中文标题】重命名多个表【英文标题】:Renaming multiple tables 【发布时间】:2012-06-12 03:53:23 【问题描述】:

在 SQL Server 中,我有一个数据库 abc。在这个数据库中,我有数百个表。这些表中的每一个都称为xyz.table

我想将所有表更改为abc.table

我们是否有办法将数据库abc 中的所有名称从xyz.table 更改为abc.table

我可以通过将每个表的架构更改为 abc 来手动更改名称

【问题讨论】:

嗨。您使用什么版本的 SQL 服务器?您想更改数据库中所有表的架构,我说得对吗? 感谢@Igor 调查。我正在使用 sql server 2008。你说得对,我想更改所有表的架构 【参考方案1】:

您可以将 Alter Schema 与未记录的存储过程 exec sp_MSforeachtable 一起使用,它基本上会遍历所有表。

  exec sp_MSforeachtable "ALTER SCHEMA new_schema TRANSFER ? PRINT '? modified' " 

用您的新架构更改 new_schema 关键字。

详情请点击链接

sp_MSforeachtable

Alter Schema for all the tables

正如其他人指出的那样,SP 已被弃用,因此还有另一种方法可以通过从 sys.tables 获取表的名称来做到这一点

Declare @value int
Set @value=1
declare @sql varchar(max), @table varchar(50), @old varchar(50), @new varchar(50)

set @old = 'dbo'
set @new = 'abc'

while exists(select * from sys.tables where schema_name(schema_id) = @old)

begin
;With CTE as
 (
  Select *,row_number() over(order by object_id) rowNumber from sys.tables 
  where schema_name(schema_id) = @old
 )
 select @table= name from CTE where @value=rowNumber
 Set @value=@value+1

 set @sql = 'alter schema ' + @new + ' transfer ' + @old + '.' + @table

 exec(@sql)
 end

【讨论】:

如果数据库在xyz 架构中有表,但def 架构中,并且 OP 只想从@987654327 中移动这些表@ 到 abc ? marc_s : 我已经更新了我的回复。不使用光标我们可以更改架构。 这也可能有效 - 但是,在我的测试中,最后一张桌子陷入了无限循环.....还有:真的很挑剔:exec() 函数的输入应该是nvarchar(...) 类型(但这真的很挑剔,同意!) 感谢 Marc_s。同意我应该将其更改为 nvarchar【参考方案2】:

我假设您已经在数据库中创建了架构 abc

如果没有可以参考这里

http://www.youtube.com/watch?v=_DDgv8uek6M

http://www.quackit.com/sql_server/sql_server_2008/tutorial/sql_server_database_schemas.cfm

要更改数据库中所有表的架构,您可以使用以下系统创建的msforeachtable 存储过程将每个表的架构重命名为alter schema。

exec sp_MSforeachtable "ALTER SCHEMA abc TRANSFER ? PRINT '? modified' "

【讨论】:

如果数据库在xyz 模式中有表,但def 模式中,并且 OP 只想从@987654329 中移动这些表@ 到 abc ?【参考方案3】:

您可以让光标在 xyz 架构中的所有表上运行,并将所有这些表移动到 abc 架构中:

DECLARE TableCursor CURSOR FAST_FORWARD 
FOR
    -- get the table names for all tables in the 'xyz' schema
    SELECT t.Name
    FROM sys.tables t 
    WHERE schema_id = SCHEMA_ID('xyz')

DECLARE @TableName sysname

OPEN TableCursor

FETCH NEXT FROM TableCursor INTO @TableName

-- iterate over all tables found    
WHILE @@FETCH_STATUS = 0
BEGIN
    DECLARE @Stmt NVARCHAR(999)

    -- construct T-SQL statement to move table to 'abc' schema
    SET @Stmt = 'ALTER SCHEMA abc TRANSFER xyz.' + @TableName
    EXEC (@Stmt)

    FETCH NEXT FROM TableCursor INTO @TableName
END

CLOSE TableCursor
DEALLOCATE TableCursor

【讨论】:

为什么我们需要一个游标?这可以通过使用内置存储过程的单行 T-SQL 语句来完成。 @ViswanathanIyer:是的 - 有一个 undocumented 过程,不能保证在 SQL Server 的下一版本中存在。光标仍然会存在——当然。另外:这种方法可以将这些表从xyz 中移出,并保留其他任何内容(根据要求) - 你可以“一行 T-SQL”做同样的事情吗? @ViswanathanIyer,这里是mssqltips.com/sqlservertip/2201/… Aaron Bertrant 报告了 sp_MSforeachtable 的中断。 Sadly, I have discovered instances where, under heavy load and/or with a large number of databases, the procedure can actually skip multiple catalogs with no error or warning message. @ViswanathanIyer 抱歉,正确的链接是mssqltips.com/tip.asp?tip=2201 @ViswanathanIyer - 该过程仍然使用游标。【参考方案4】:

在不使用未记录/不受支持的sp_MSforeachtable 过程的情况下,这里有一种简洁的方法来为给定架构上的每个表选择和/或运行所有必要的 ALTER 语句:

declare @oldSchema nvarchar(50) = 'abc'  -- usually 'dbo'
declare @newSchema nvarchar(50) = 'xyz'  -- use your new schema name

declare @sql nvarchar(max) = 
(select
  (select N'alter schema [' + @newSchema + '] transfer [' + @oldSchema + '].[' + name + ']
' as 'data()'
   from sys.tables
   where schema_name(schema_id) = @oldSchema for xml path(''), type)
 .value('text()[1]','nvarchar(max)'))

-- You can select out the results for scrutiny
select @sql

-- Or you can execute the results directly
exec (@sql)

这避免了使用游标,并使用括号来转义可能与 SQL 关键字冲突的表名。

【讨论】:

以上是关于重命名多个表的主要内容,如果未能解决你的问题,请参考以下文章

Oracle查询语句中重命名的列在WHERE中无效?

复制重命名覆盖mod是啥意思?

如何重命名用户创建的 SYSUSERS 表?

bat脚本照片复制重命名?

for in循环语句批量重命名的问题;bash

用于 ManyToMany 的 Symfony Doctrine 重命名表