Zmień nazwę kolumny SQL Server 2008

652

Używam SQL Server 2008 i Navicat. Muszę zmienić nazwę kolumny w tabeli za pomocą SQL.

ALTER TABLE table_name RENAME COLUMN old_name to new_name;

To stwierdzenie nie działa.

Serhio g. Lazin
źródło
2
sprawdź stackoverflow.com/questions/174582/…
swetha 30.04.2013
5
Zauważ, że nie jest to do końca duplikat pytania nr 174582, które swetha połączył: ten jest specyficzny dla MS SQL, ten jest agnostyczny dla bazy danych.

Odpowiedzi:

1194

Posługiwać się sp_rename

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

Patrz: SERWER SQL - Jak zmienić nazwę kolumny lub nazwy tabeli

Dokumentacja: sp_rename (Transact-SQL)

W twoim przypadku byłoby to:

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

Pamiętaj, aby używać pojedynczych cudzysłowów w celu zawarcia wartości.

Habib
źródło
24
Zauważ, że nie powinieneś umieszczać NewColumnName w nawiasach, ponieważ SQL Server użyje wtedy [[[NewColumnName]]] jako nazwy nowej kolumny. Ponadto nazwa sp_rename powinna być poprzedzona EXEC lub EXECUTE.
Mark Freeman
29
Możesz i zachęcamy do umieszczania nawiasów w pierwszym parametrze, identyfikującym kolumnę, ale nie w drugim parametrze. W ten sposób:EXEC sp_RENAME '[TableName].[OldColumnName]', 'NewColumnName', 'COLUMN'
Niels Brinch
2
Należy pamiętać, że w swojej odpowiedzi to zapisane uchwyty domyślne wartości procedura, null itp contraints robiąc zmiany nazwy, w przeciwieństwie do zwykłego alter table, że zakończy się niepowodzeniem, jeśli istnieją takie ograniczenia.
Tuncay Göncüoğlu
4
Pamiętaj, że jeśli użyjesz „nazwa_tabeli.nowa_nazwa”, zmieni się ona w [schemat]. [Nazwa_tabeli]. [Nazwa_tabeli.nazwa] - więc nie umieszczaj tej nazwy tabeli pod nową nazwą! (w tej odpowiedzi jest poprawne, wystarczy dodać notatkę dla podglądaczy)
Mark Schultheiss
1
Jeśli w bazie danych znajduje się schemat, musisz umieścić nazwę schematu przed nazwą tabeli: EXEC sp_RENAME 'nazwa_schematu.nazwa_tabeli.nazwa_ starej ”,„ nowa_nazwa ”,„ KOLUMNA ”
amin
106

Alternatywnie SQLmożesz to zrobić w Microsoft SQL Server Management Studio. Oto kilka szybkich sposobów korzystania z GUI:

Pierwszy sposób

Powoli kliknij dwukrotnie kolumnę. Nazwa kolumny stanie się edytowalnym polem tekstowym.


Drugi sposób

Kliknij kolumnę prawym przyciskiem myszy i wybierz polecenie Zmień nazwę z menu kontekstowego.

Na przykład:

Aby zmienić nazwę kolumny


Trzeci sposób

Ten sposób jest preferowany, gdy trzeba zmienić nazwę wielu kolumn za jednym razem.

  1. Kliknij prawym przyciskiem myszy tabelę zawierającą kolumnę wymagającą zmiany nazwy.
  2. Kliknij Projekt .
  3. W panelu projektu tabeli kliknij i edytuj pole tekstowe nazwy kolumny, którą chcesz zmienić.

Na przykład: Przykład projektowania tabeli MSSMS

UWAGA: Wiem, że OP specjalnie poprosił o rozwiązanie SQL, pomyślałem, że może to pomóc innym :)

Carrie Kendall
źródło
1
Lub użytkownik nie ma uprawnień.
Carrie Kendall,
6
Nigdy tego nie rób. Kopiujesz tabelę, a następnie upuszczasz stary i zmieniasz jego nazwę. NIGDY nie należy używać GUI EVER do zmiany czegokolwiek na temat tabeli.
HLGEM
6
@HLGEM to całkiem spora instrukcja. W każdym razie, czy możesz podać jakieś zasoby do tego, co wyjaśniłeś? tj. upuszczenie stołu itp.
Carrie Kendall
2
@CarrieKendall, wypisz zmianę z GUI zamiast ją wprowadzić, a zobaczysz. Dlatego o wiele wolniej jest dokonywać zmian za pomocą GUI do dużej tabeli niż przy użyciu sp_rename lub alter table. Ponadto zmiany w strukturze bazy danych są zmianami w kodzie i powinny być pod kontrolą źródła, podobnie jak inne kody, więc powinny być w skrypcie. Jest to szczególnie ważne, jeśli nie zezwalasz na zmiany praw do tworzenia tabel w bazie danych deweloperów, ponieważ w każdym przypadku będziesz potrzebować skryptu. I nie chcesz zajmować się kopiowaniem, upuszczaniem i odtwarzaniem tabel z milionami rekordów na prod.
HLGEM
18
Właśnie zmieniłem nazwę tabeli programu SQL Server 2012 za pomocą Management Studio z uruchomionym profilerem i użyłem sp_rename. Nie mogę jednak mówić o wcześniejszych wersjach.
Steve Dowling
58

Próbować:

EXEC sp_rename 'TableName.OldName', 'NewName', 'COLUMN'
TechDo
źródło
27

Powinieneś również określić schemat tabeli, w przeciwnym razie możesz otrzymać ten błąd:

Msg 15248, poziom 11, stan 1, procedura nazwa_sp, wiersz 238 Albo parametr @objname jest niejednoznaczny, albo deklarowany @objtype (COLUMN) jest niepoprawny.

Jeśli jest to skrypt wdrażania, poleciłbym również dodanie do niego dodatkowych zabezpieczeń.

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';
Taher
źródło
Podoba mi się to bezpieczne podejście, dobre do pisania migracji, które mogą / mogą nie działać w różnych środowiskach.
Adil H. Raza
jak kontrola istnienia, sprawia, że ​​czuję się dobrze, uruchamiając ponownie jako część zestawu innych skryptów
nieznany
19

Dobrą propozycją byłoby użycie już wbudowanej funkcji, ale innym sposobem jest:

  1. Utwórz nową kolumnę z tym samym typem danych i NEW NAME.
  2. Uruchom instrukcję UPDATE / INSERT, aby skopiować wszystkie dane do nowej kolumny.
  3. Upuść starą kolumnę.

Zaletą korzystania z niego sp_renamejest to, że dba on o wszystkie relacje z nim związane.

Z dokumentacji :

sp_rename automatycznie zmienia nazwę powiązanego indeksu za każdym razem, gdy zmienia się nazwa klucza PRIMARY KEY lub UNIQUE. Jeśli indeks o zmienionej nazwie jest powiązany z ograniczeniem PIERWOTNY KLUCZ, ograniczenie PIERWOTNY KLUCZ jest również automatycznie zmieniane przez sp_rename. sp_rename może być używany do zmiany nazw głównych i pomocniczych indeksów XML.

NeverHopeless
źródło
* W kroku 1 NULL musi być dozwolone w nowej kolumnie * Opcjonalnie dodaj czwarty krok, aby zmienić nową kolumnę, aby nie zezwalała na wartości NULL
BitLauncher 10.0919
16

Możesz użyć sp_renamedo zmiany nazwy kolumny.

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

Pierwszym parametrem jest obiekt do modyfikacji, drugi parametr to nowa nazwa, która zostanie podana do obiektu, a trzeci parametr KOLUMNA informuje serwer, że zmiana nazwy jest dla columni może być również używany do zmiany nazwy tables, indexa alias data type.

Alexandre Neukirchen
źródło
2
Nie rozumiesz, dlaczego dodajesz nową odpowiedź nawet powyżej 4 na 5 wzmianek o sp_rename ...?
Paweł Czapski
3
W pewnym momencie ktoś musiałby wyjaśnić tutaj działanie parametru, nikt tego nie zrobił
Alexandre Neukirchen,
1
Tak, właściwie masz rację, dla mnie to takie oczywiste, ale dla nowych chłopaków może nie być.
Paweł Czapski
12

Ponieważ często tu przychodzę i zastanawiam się, jak używać nawiasów, ta odpowiedź może być przydatna dla takich jak ja.

EXEC sp_rename '[DB].[dbo].[Tablename].OldColumnName', 'NewColumnName', 'COLUMN'; 
  • Nie OldColumnNamemoże być w []. To nie zadziała.
  • Nie należy wkładać NewColumnNamedo [], będzie to prowadzić do [[NewColumnName]].
HonzaB
źródło
3

SQL Server Management Studio ma jakiś system zdefiniowanej procedury przechowywane (SP),
z których jeden jest stosowany w celu zmiany nazwy column.The SP procedury sp_rename

Składnia: nazwa_sp. „[Nazwa_tabeli]. Stara_nazwa_kolumny”, „nowa_nazwa_kolumny”
Aby uzyskać dalszą pomoc, zapoznaj się z tym artykułem: nazwa_spy przez Microsoft Docs

Uwaga: po wykonaniu tego SP serwer SQL wyświetli komunikat ostrzegawczy jako „ Uwaga: Zmiana dowolnej części nazwy obiektu może spowodować uszkodzenie skryptów i procedur przechowywanych ”. Jest to krytyczne tylko wtedy, gdy napisałeś własny SP, który obejmuje kolumnę w tabeli, którą zamierzasz zmienić.

Tahir77667
źródło
2

Ulepszona wersja @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
Rikin Patel
źródło
0

Lub możesz po prostu dwukrotnie kliknąć dwukrotnie kolumnę w SQL Management Studio i zmienić jej nazwę za pomocą interfejsu użytkownika ...

Dave Cole
źródło
-1

Uruchom zapytanie:

    SP_RENAME '[TableName].[ColumnName]','NewNameForColumn'
Purnima Bhatia
źródło
Proszę nie powtarzać długofalowych i istniejących odpowiedzi z większą liczbą głosów.
TT.