重命名多个表

时间:2012-06-08 04:00:16

标签: sql-server sql-server-2008

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

我想更改所有要调用的表abc.table

我们是否可以通过这种方式将数据库xyz.table中的所有名称从abc.table更改为abc

我可以通过将每个表的架构更改为abc

来手动更改名称

4 个答案:

答案 0 :(得分:7)

您可以在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

答案 1 :(得分:4)

您可以将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

答案 2 :(得分:0)

我假设您已经在数据库中创建了模式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' "

答案 3 :(得分:0)

不使用未记录/不受支持的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关键字冲突的表名。