Переименовать столбец SQL Server 2008

653

Я использую SQL Server 2008 и Navicat. Мне нужно переименовать столбец в таблице с помощью SQL.

ALTER TABLE table_name RENAME COLUMN old_name to new_name;

Это утверждение не работает.

Serhio g. Lazin
источник
2
проверить stackoverflow.com/questions/174582/…
swetha
5
Обратите внимание, что это не совсем дубликат вопроса № 174582, который связан между собой: этот вопрос относится к MS SQL, а другой не зависит от базы данных.

Ответы:

1195

использование sp_rename

EXEC sp_RENAME 'TableName.OldColumnName' , 'NewColumnName', 'COLUMN'

См .: SQL SERVER - Как переименовать имя столбца или имя таблицы

Документация: sp_rename (Transact-SQL)

Для вашего случая это будет:

EXEC sp_RENAME 'table_name.old_name', 'new_name', 'COLUMN'

Не забудьте использовать одинарные кавычки, чтобы заключить ваши значения.

Хабиб
источник
24
Обратите внимание, что вы не должны помещать NewColumnName в скобки, поскольку SQL Server будет использовать [[[NewColumnName]]] в качестве имени нового столбца. Кроме того, sp_rename должен иметь префикс EXEC или EXECUTE.
Марк Фриман
29
Вам разрешается и рекомендуется заключать скобки в первый параметр, идентифицируя столбец, но не во второй параметр. Как это:EXEC sp_RENAME '[TableName].[OldColumnName]', 'NewColumnName', 'COLUMN'
Нильс Бринч
2
Следует отметить в своем ответе , что эта хранимая процедура значения ручки по умолчанию, нулевые и т.д. контрсилами при этом переименование, в отличие от равнины , alter tableкоторая будет выполнена , если существуют такие ограничения.
Tuncay Göncüoğlu
4
Обратите внимание, что если вы используете 'table_name.new_name', то оно становится [schema]. [Table_name]. [Table_name.new_name] - поэтому не помещайте это имя таблицы в новое имя! (это правильно в этом ответе, просто добавив примечание для писков)
Марк Шультхайс
1
Если в базе данных есть схема, вы должны поместить имя схемы перед именем таблицы: EXEC sp_RENAME 'имя_символа_таблицы.old_name', 'new_name', 'COLUMN'
амин
106

В качестве альтернативы SQL, вы можете сделать это в Microsoft SQL Server Management Studio. Вот несколько быстрых способов использования графического интерфейса:

Первый путь

Медленный двойной щелчок по столбцу. Имя столбца станет редактируемым текстовым полем.


Второй путь

Щелкните правой кнопкой мыши по столбцу и выберите Rename из контекстного меню.

Например:

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


Третий путь

Этот способ предпочтителен, если вам нужно переименовать несколько столбцов за один раз.

  1. Щелкните правой кнопкой мыши таблицу, содержащую столбец, который необходимо переименовать.
  2. Нажмите Дизайн .
  3. На панели дизайна таблицы щелкните и измените текстовое поле с именем столбца, которое вы хотите изменить.

Например: Пример оформления таблицы MSSMS

ПРИМЕЧАНИЕ: я знаю, что OP специально спрашивал о решении SQL, думал, что это может помочь другим :)

Кэрри Кендалл
источник
1
Или пользователь не имеет привилегий.
Кэрри Кендалл,
6
Никогда не делай этого. Вы копируете таблицу, затем отбрасываете старую и переименовываете ее. НИКОГДА не используйте графический интерфейс, чтобы изменить что-либо в таблице.
HLGEM
6
@HLGEM это довольно большое общее заявление. В любом случае, можете ли вы предоставить какие-либо ресурсы для того, что вы объяснили? то есть падение таблицы и т. д.
Кэрри Кендалл,
2
@CarrieKendall, сделайте сценарий изменения из графического интерфейса вместо того, чтобы сделать это, и вы увидите. Вот почему гораздо медленнее вносить изменения с помощью графического интерфейса в большую таблицу, чем с помощью sp_rename или alter table. Кроме того, изменения в структуре базы данных являются изменениями кода и должны находиться в системе контроля версий, как и другой код, поэтому должны быть в скрипте. Это особенно важно, если вы не разрешаете правам рабочей производственной базы данных изменять таблицы, поскольку в любом случае вам понадобится скрипт. И вы не хотите заниматься копированием, удалением и воссозданием таблиц с миллионами записей на prod.
HLGEM
18
Я просто переименовал таблицу SQL Server 2012, используя Management Studio с запущенным профилировщиком, и он использовал sp_rename. Хотя не могу говорить о более ранних версиях.
Стив Доулинг
58

Пытаться:

EXEC sp_rename 'TableName.OldName', 'NewName', 'COLUMN'
TechDo
источник
27

Вам также следует указать схему таблицы, иначе вы можете получить эту ошибку:

Сообщение 15248, уровень 11, состояние 1, процедура sp_rename, строка 238 Либо параметр @objname является неоднозначным, либо заявленный @objtype (COLUMN) неверен.

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

IF EXISTS (
        SELECT 1
        FROM sys.columns
        WHERE
            name = 'OldColumnName' AND
            object_name(object_id) = 'TableName'
    ) AND
    NOT EXISTS (
        SELECT 1
        FROM sys.columns
        WHERE
            name = 'NewColumnName' AND
            object_name(object_id) = 'TableName'
    )
    EXEC sp_RENAME 'SchemaName.TableName.OldColumnName', 'NewColumnName', 'COLUMN';
Тахир
источник
Мне нравится этот безопасный подход, подходящий для написания миграций, которые могут / не могут работать в разных средах.
Адиль Х. Раза
как проверка существования, я чувствую себя хорошо, перезапускаясь как часть пакета других сценариев
неизвестно
19

Было бы хорошим предложением использовать уже встроенную функцию, но есть и другой способ:

  1. Создайте новый столбец с тем же типом данных и NEW NAME.
  2. Запустите инструкцию UPDATE / INSERT, чтобы скопировать все данные в новый столбец.
  3. Оставьте старую колонку.

Преимущество использования sp_renameзаключается в том, что оно заботится обо всех связанных с ним отношениях.

Из документации :

sp_rename автоматически переименовывает связанный индекс всякий раз, когда ограничение PRIMARY KEY или UNIQUE переименовывается. Если переименованный индекс связан с ограничением PRIMARY KEY, ограничение PRIMARY KEY также автоматически переименовывается в sp_rename. sp_rename может использоваться для переименования первичных и вторичных индексов XML.

NeverHopeless
источник
* На шаге 1 в новом столбце должно быть разрешено NULL * При желании добавьте 4-й шаг, чтобы изменить новый столбец, чтобы он не допускал значений NULL
BitLauncher
16

Вы можете использовать sp_renameдля переименования столбца.

USE YourDatabase;  
GO  
EXEC sp_rename 'TableName.OldColumnName', 'NewColumnName', 'COLUMN';  
GO  

Первый параметр является объектом , который следует модифицировать, второй параметр это новое имя , которое будет дано на объект, и третий параметр COLUMN информирует сервер о том , что переименования для column, а также могут быть использованы для переименования tables, indexи alias data type.

Александр Нойкирхен
источник
2
Не понимаю, почему вы добавляете новый ответ даже выше 4 из 5 упоминаний о sp_rename ...?
Павел Чапски
3
В какой-то момент кому-то придется объяснить здесь действие параметра, никто не сделал этого
Александр Нойкирхен
1
Да, на самом деле вы правы, для меня это так очевидно, но для новых ребят это может быть не так.
Павел Чапски
12

Поскольку я часто прихожу сюда, а потом удивляюсь, как использовать скобки, этот ответ может быть полезен для таких, как я.

EXEC sp_rename '[DB].[dbo].[Tablename].OldColumnName', 'NewColumnName', 'COLUMN'; 
  • Не OldColumnNameдолжно быть в []. Он не будет работать.
  • Не вкладывайте NewColumnNameв []это, это приведет к [[NewColumnName]].
HonzaB
источник
3

В Sql Server Management Studio есть определенные системные хранимые процедуры (SP),
одна из которых используется для переименования столбца. SP - sp_rename

Синтаксис: sp_rename '[table_name] .old_column_name', 'new_column_name'
Для получения дополнительной информации обратитесь к этой статье: sp_rename от Microsoft Docs

Примечание. При выполнении этого SP сервер sql выдаст вам предупреждение: « Осторожно: изменение любой части имени объекта может привести к поломке скриптов и хранимых процедур ». Это важно, только если вы написали свой собственный sp, включающий столбец в таблице вы собираетесь изменить.

Tahir77667
источник
2

Улучшенная версия @Taher

DECLARE @SchemaName AS VARCHAR(128)
DECLARE @TableName AS VARCHAR(128)
DECLARE @OldColumnName AS VARCHAR(128)
DECLARE @NewColumnName AS VARCHAR(128)
DECLARE @ParamValue AS VARCHAR(1000)

SET @SchemaName = 'dbo'
SET @TableName = 'tableName'
SET @OldColumnName = 'OldColumnName'
SET @NewColumnName = 'NewColumnName'
SET @ParamValue = @SchemaName + '.' + @TableName + '.' + @OldColumnName

IF EXISTS
(
    SELECT 1 FROM sys.columns WHERE name = @OldColumnName AND OBJECT_NAME(object_id) = @TableName
)
AND NOT EXISTS
(
    SELECT 1 FROM sys.columns WHERE name = @NewColumnName AND OBJECT_NAME(object_id) = @TableName
)
BEGIN
    EXEC sp_rename @ParamValue, @NewColumnName, 'COLUMN';
END
Рикин Патель
источник
0

Или вы можете просто дважды щелкнуть по столбцу в SQL Management Studio и переименовать его через пользовательский интерфейс ...

Дейв Коул
источник
-1

Запустить запрос:

    SP_RENAME '[TableName].[ColumnName]','NewNameForColumn'
Пурнима Бхатия
источник
Пожалуйста, не повторяйте давние и существующие ответы с большим количеством голосов.
ТТ.