Renaming multiple tables

前端 未结 4 377
忘了有多久
忘了有多久 2020-12-07 03:31

In SQL Server, I have a database abc. In this database I have hundreds of tables. Each of these tables is called xyz.table

I want to change

相关标签:
4条回答
  • 2020-12-07 04:04

    You can use Alter Schema with an undocumented Stored Procedure exec sp_MSforeachtable which basically iterates through all the tables .

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

    change the new_schema keyword with your new Schema .

    For details please go through the link

    sp_MSforeachtable

    Alter Schema for all the tables

    As others have pointed out that the SP is deprecated so There is another way to do this by getting the names of the table from 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
    
    0 讨论(0)
  • 2020-12-07 04:07

    Without using the undocumented/unsupported sp_MSforeachtable procedure, here's a somewhat concise way to select and/or run all of the necessary ALTER statements for every table on the given schema:

    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)
    

    This avoids using a cursor, and uses brackets to escape table names that may conflict with SQL keywords.

    0 讨论(0)
  • 2020-12-07 04:16

    You could have a cursor run over all your tables in the xyz schema and move all of those into the abc schema:

    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
    
    0 讨论(0)
  • 2020-12-07 04:18

    I'm assuming You've already created the schema abc in the database.

    If not you can refer here

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

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

    To change the schema of all the tables in database you can use following system created msforeachtable stored procedure to rename schema of each table with alter schema.

    exec sp_MSforeachtable "ALTER SCHEMA abc TRANSFER ? PRINT '? modified' "
    
    0 讨论(0)
提交回复
热议问题