Как переименовать таблицу в SQL Server? - PullRequest
351 голосов
/ 17 марта 2011

Я использовал SQL запрос:

ALTER TABLE oldtable RENAME TO newtable;

Но он выдает ошибку.

Сервер: Msg 156, Уровень 15, Состояние 1, Строка 1
Неверный синтаксис рядом с ключевым словом 'TO'.

Ответы [ 7 ]

637 голосов
/ 17 марта 2011

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

exec sp_rename 'schema.old_table_name', 'new_table_name'
132 голосов
/ 17 мая 2013

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

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

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

sp_rename 'old_table_name','new_table_name';
14 голосов
/ 01 февраля 2014

При использовании 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'

Итак, все эти зависимые объекты также необходимо обновить

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

9 голосов
/ 11 января 2017

Если вы попробуете 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';
6 голосов
/ 17 февраля 2016

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

EXEC sp_rename 'MyTable', 'MyTableNewName';
5 голосов
/ 02 августа 2015

Название таблицы

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'

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

0 голосов
/ 04 июня 2018

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

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

, возможно, будет кому-то полезно.новая схема также dbo был владельцем ..

ОБНОВЛЕНИЕ

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

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

...