Перейменуйте стовпчик SQL Server 2008


652

Я використовую SQL Server 2008 та Navicat. Мені потрібно перейменувати стовпчик у таблиці за допомогою SQL.

ALTER TABLE table_name RENAME COLUMN old_name to new_name;

Ця заява не працює.



5
Зауважте, що це не зовсім дублікат запитання №174582, з яким пов'язується шведа: це специфічний для MS SQL, а саме - база даних-агностик.

Відповіді:


1194

Використовуйте 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_reef має бути встановлено EXEC або EXECUTE.
Марк Фрімен

29
Вам дозволяється і рекомендується ставити дужки в перший параметр, ідентифікуючи стовпець, але не у другий параметр. Ось так:EXEC sp_RENAME '[TableName].[OldColumnName]', 'NewColumnName', 'COLUMN'
Нільс Брінч

2
Ви повинні зазначити у своїй відповіді, що ця збережена процедура обробляє значення за замовчуванням, нульові тощо контракти , виконуючи перейменування, на відміну від звичайної, alter tableяка НЕ ​​ЗНАЄ, якщо такі обмеження існують.
Tuncay Göncüoğlu

4
Зауважте, що якщо ви використовуєте "table_name.new_name", він стає [схемою]. [Table_name]. [Table_name.new_name] - тому не ставте це ім'я таблиці новим ім'ям! (це правильно у цій відповіді, просто додавши замітку для підглядання)
Марк Шультхейс

1
Якщо є схеми в базі даних ви повинні помістити ім'я схеми перед ім'ям таблиці: EXEC sp_rename «schema_name.table_name.old_name», «NEW_NAME», «COLUMN»
Амін

106

Як альтернативи SQL, ви можете зробити це в Microsoft SQL Server Management Studio. Ось кілька швидких способів використання графічного інтерфейсу:

Перший шлях

Повільно двічі клацніть на стовпчику. Назва стовпця стане редагованим текстовим полем.


Другий шлях

Клацніть правою кнопкою миші на стовпці та виберіть Перейменувати у контекстному меню.

Наприклад:

Перейменувати назву стовпця


Третій шлях

Цей спосіб є кращим, коли вам потрібно перейменувати кілька стовпців за один раз.

  1. Клацніть правою кнопкою миші на таблиці, що містить стовпчик, який потребує перейменування.
  2. Клацніть Дизайн .
  3. На панелі дизайну таблиці натисніть та відредагуйте текстове поле стовпця, яке ви хочете змінити.

Наприклад: Приклад дизайну таблиці MSSMS

ПРИМІТКА: Я знаю, що OP спеціально просив рішення SQL, думав, що це може допомогти іншим :)


1
Або користувач не має привілеїв.
Керрі Кендалл

6
Ніколи ніколи цього не роби. Ви копіюєте таблицю, потім скидаєте стару та перейменовуєте її. НІКОЛИ не використовуйте GUI EVER, щоб змінити щось про таблицю.
HLGEM

6
@HLGEM - це дуже велика заява про ковдру. У будь-якому випадку, чи можете ви надати якісь ресурси для того, що ви пояснили? тобто відкидання столу тощо
Керрі Кендалл

2
@CarrieKendall, скриптуйте зміну з графічного інтерфейсу замість того, щоб вносити її, і ви побачите. Ось чому набагато повільніше вносити зміни за допомогою GUI у велику таблицю, ніж через використання sp_rename або alter table. Крім того, зміни в структурі бази даних є змінами коду і повинні знаходитись у контролі джерела, як і інший код, так і в сценарії. Це особливо важливо, якщо ви не дозволяєте правам бази даних розробників змінювати таблиці, оскільки сценарій вам буде потрібен у будь-якому випадку. І ви не хочете займатись копіюванням, скиданням та відтворенням таблиць з мільйонами записів на продажі.
HLGEM

18
Я щойно перейменував таблицю SQL Server 2012 за допомогою студії Management з запущеним профілером і використовував sp_rename. Не можу говорити про більш ранні версії.
Стів Даулінг


27

Ви також повинні вказати схему таблиці, або ви можете отримати цю помилку:

Msg 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. Створіть новий стовпець з тим самим типом даних та НОВОЮ ІМЕЮ.
  2. Запустіть операцію UPDATE / INSERT, щоб скопіювати всі дані в новий стовпець.
  3. Відкиньте стару колонку.

Перевага використання цього засобу sp_renameполягає в тому, що він піклується про всі відносини, пов'язані з ним.

З документації :

sp_rename автоматично перейменовує асоційований індекс кожного разу, коли ПЕРВІЙНИЙ КЛЮЧ або УНІКАЛЬНЕ обмеження буде перейменовано. Якщо перейменований індекс прив'язаний до обмеження PRIMARY KEY, обмеження PRIMARY KEY також автоматично перейменовується на ім'я sp_rename. sp_rename можна використовувати для перейменування первинних та вторинних індексів XML.


* На кроці 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 ...?
Pawel Czapski

3
У якийсь момент комусь доведеться пояснювати тут функціонування параметра, ніхто цього не робив
Олександр Неукірхен

1
Так, насправді ти маєш рацію, для мене це очевидно, але для нових хлопців це не може бути.
Pawel Czapski

12

Оскільки я часто приїжджаю сюди, а потім задаюся питанням, як використовувати дужки, ця відповідь може бути корисною для таких, як я.

EXEC sp_rename '[DB].[dbo].[Tablename].OldColumnName', 'NewColumnName', 'COLUMN'; 
  • Не OldColumnNameповинно бути в []. Це не спрацює.
  • Ніколи не кладіть NewColumnNameу []це призведе до [[NewColumnName]].

3

Sql студія управління сервером має деяку систему , певну збережені процедури (SP)
Один з них використовується для перейменування column.The SP є sp_rename

Синтаксис: ім'я sp_rename '[ім'я_матеріали] .old_column_name', 'new_column_name'.
Для отримання додаткової інформації зверніться до цієї статті: sp_rename від Microsoft Docs

Примітка. Після виконання цього SP сервер sql видасть вам повідомлення про застереження як " Обережно: Зміна будь-якої частини імені об'єкта може порушити сценарії та збережені процедури ". Це критично, лише якщо ви написали свій власний sp, який включає стовпець в таблиці, яку ви збираєтеся змінити.


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 та перейменувати його через інтерфейс користувача ...


-1

Виконати запит:

    SP_RENAME '[TableName].[ColumnName]','NewNameForColumn'

Будь ласка, не повторюйте давніх та існуючих відповідей з багатьма голосами.
ТТ.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.