Переименование нескольких таблиц

В SQL Server у меня есть база данных abc. В этой базе данных есть сотни таблиц. Каждая из этих таблиц называется xyz.table

Я хочу изменить все таблицы, которые будут называться abc.table.

Есть ли способ, с помощью которого я могу изменить все имена от xyz.table до abc.table в базе данных abc?

Я могу вручную изменить имя, изменив схему для каждой таблицы на abc

Ответ 1

Вы можете использовать Alter Schema с недокументированной хранимой процедурой exec sp_MSforeachtable, которая в основном выполняет итерацию по всем таблицам.

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

измените ключевое слово new_schema на новую схему.

Подробнее см. ссылку

sp_MSforeachtable

Изменить схему для всех таблиц

Как отмечают другие, 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 @[email protected]+1

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

 exec(@sql)
 end

Ответ 2

В схеме xyz курсор пробежит все ваши таблицы в схеме 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

Ответ 3

Я предполагаю, что вы уже создали схему abc в базе данных.

Если вы не можете найти здесь

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

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

Чтобы изменить схему всех таблиц в базе данных, вы можете использовать следующую систему, созданную msforeachtable, чтобы переименовать схему каждой таблицы с помощью изменить схему.

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

Ответ 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.