Как переименовать таблицу в SQL Server?

370

SQLЗапрос , который я использовал это:

ALTER TABLE oldtable RENAME TO newtable;

Но это дает мне ошибку.

Сервер: сообщение 156, уровень 15, состояние 1, строка 1
Неверный синтаксис рядом с ключевым словом «TO».

переключатель
источник

Ответы:

683

Чтобы переименовать таблицу в SQL Server, используйте sp_renameкоманду:

exec sp_rename 'schema.old_table_name', 'new_table_name'
Джефф Хорнби
источник
7
Еще одна вещь: если любое из имен таблиц содержит .в себе, используйте []вокруг имени таблицы. (Я знаю, я знаю, но точки могут произойти ...) Например, sp_rename '[Stupid.name]', 'NewName'или со схемойsp_rename '[dbo.Stupid.name]', 'NewName'
Vacip
55
И добавим, что случайно не помещайте схему в 'NewName'поле, иначе ваша таблица может выглядеть примерно так dbo.dbo.NewName.
Майкл
4
Имейте в виду, что при переименовании таблицы вы почти наверняка захотите переименовать любые ссылки на эту таблицу, которые могут существовать в хранимых процедурах, представлениях, функциях и т. Д. Быстрый Google может найти один из многих инструментов, которые могут сделать это для вас. , Или вы можете использовать скрипт, который находит данную строку во всех этих объектах, вставлять их как операторы ALTER, выполнять поиск и замену, а затем запускать их все.
MGOwen
2
Вы также можете создать синоним, названный в честь старого имени таблицы, указывающего на новую таблицуCREATE SYNONYM [schema].[synonymName] FOR [schema].[tableName]
Ruskin
не ставьте новое имя в квадратных скобках! в противном случае таблица будет иметь квадратные скобки в имени. Итак, 'new_table_name' - правильно, '[new_table_name]' - доставит вам неприятности
VeganHunter
143

Чтобы переименовать столбец:

sp_rename 'table_name.old_column_name', 'new_column_name' , 'COLUMN';

Чтобы переименовать таблицу:

sp_rename 'old_table_name','new_table_name';
Рави Кумар
источник
Не объясняет, как обрабатывать схемы, отличные от dbo по умолчанию.
Сэл
1
@Sal Не меньше, чем любой другой ответ здесь? Вы искали, как изменить схему таблицы ?
Бекон Биты
14

При использовании sp_rename, который работает как в приведенных выше ответах, проверьте также, какие объекты затрагиваются после переименования, которые ссылаются на эту таблицу, потому что их тоже нужно изменить

Я взял пример кода для табличных зависимостей в блоге Пинала Дейва здесь

USE AdventureWorks
GO
SELECT
referencing_schema_name = SCHEMA_NAME(o.SCHEMA_ID),
referencing_object_name = o.name,
referencing_object_type_desc = o.type_desc,
referenced_schema_name,
referenced_object_name = referenced_entity_name,
referenced_object_type_desc = o1.type_desc,
referenced_server_name, referenced_database_name
--,sed.* -- Uncomment for all the columns
FROM
sys.sql_expression_dependencies sed
INNER JOIN
sys.objects o ON sed.referencing_id = o.[object_id]
LEFT OUTER JOIN
sys.objects o1 ON sed.referenced_id = o1.[object_id]
WHERE
referenced_entity_name = 'Customer'

Таким образом, все эти зависимые объекты должны быть обновлены также

Или используйте некоторые надстройки, если вы можете, некоторые из них имеют функцию для переименования объекта, и все также зависят от объектов.


источник
11

Если вы попытаетесь exec sp_renameполучить ошибку LockMatchID, это может помочь сначала добавить оператор use [database]:

Я старался

 exec sp_rename '[database_name].[dbo].[table_name]', 'new_table_name';
 -- Invalid EXECUTE statement using object "Object", method "LockMatchID".

Чтобы исправить это, я должен был переписать его так:

use database_name
exec sp_rename '[dbo].[table_name]', 'new_table_name';
Stian
источник
10

Имя таблицы

sp_rename 'db_name.old_table_name', 'new_table_name'

колонка

sp_rename 'db_name.old_table_name.name' 'userName', 'COLUMN'

Индекс

sp_rename 'db_name.old_table_name.id', 'product_ID', 'INDEX'

также доступны для статики и типов данных

budamivardi
источник
2
В столбце пропущена запятая между первым и вторым параметрами. Это должно быть: sp_rename 'db_name.old_table_name.name', 'userName', 'COLUMN'
sebastian.roibu
7

Это то, что я использую:

EXEC sp_rename 'MyTable', 'MyTableNewName';
Сильвен Родриг
источник
0

Ничто не сработало из предложенного здесь .. Так что просто поместил данные в новую таблицу

SELECT * 
INTO [acecodetable].['PSCLineReason']
FROM [acecodetable].['15_PSCLineReason'];

может быть кому то пригодится ..

В моем случае он не распознал новую схему, а dbo был владельцем ..

ОБНОВИТЬ

EXECUTE sp_rename N'[acecodetable].[''TradeAgreementClaim'']', N'TradeAgreementClaim';

Работал на меня. Я нашел это из скрипта, сгенерированного автоматически при обновлении PK для одной из таблиц. Таким образом, он также распознал новую схему.

Цви Григорий Кайданов
источник
0

Чтобы изменить имя таблицы с другой схемой:

Пример: измените dbo.MyTable1 на wrk.MyTable2

EXEC SP_RENAME 'dbo.MyTable1', 'MyTable2'

ALTER SCHEMA wrk TRANSFER dbo.MyTable2
живи любя
источник