Jak zmienić nazwę tabeli w SQL Server?

369

SQLZapytanie, które użyłem to:

ALTER TABLE oldtable RENAME TO newtable;

Ale daje mi błąd.

Serwer: Msg 156, poziom 15, stan 1, wiersz 1
Niepoprawna składnia w pobliżu słowa kluczowego „TO”.

Przełącznik
źródło

Odpowiedzi:

683

Aby zmienić nazwę tabeli w SQL Server, użyj sp_renamepolecenia:

exec sp_rename 'schema.old_table_name', 'new_table_name'
Jeff Hornby
źródło
7
Jeszcze jedno: jeśli którakolwiek z nazw tabel zawiera .w sobie, użyj jej []wokół nazwy tabeli. (Wiem, wiem, ale kropki mogą się zdarzyć ...) Np. sp_rename '[Stupid.name]', 'NewName'Lub ze schematemsp_rename '[dbo.Stupid.name]', 'NewName'
vacip
55
I dodając, nie należy przypadkowo umieszczać schematu w 'NewName'polu, w przeciwnym razie twoja tabela może wyglądać podobnie dbo.dbo.NewName.
Michael Plautz
4
Należy pamiętać, że zmieniając nazwę tabeli, prawie na pewno chcesz również zmienić nazwę wszelkich odwołań do tej tabeli, które mogą istnieć w procedurach przechowywanych, widokach, funkcjach itp . Szybki Google może znaleźć jedno z wielu narzędzi, które mogą to dla Ciebie zrobić . Możesz też użyć skryptu, który znajdzie dany ciąg we wszystkich tych obiektach i wkleić je jako instrukcje ALTER oraz wykonać operację znajdź i zamień, a następnie uruchom je wszystkie.
MGOwen 19.04.17
2
Możesz także utworzyć synonim o nazwie po starej nazwie tabeli wskazującej na nową tabelęCREATE SYNONYM [schema].[synonymName] FOR [schema].[tableName]
Ruskin
nie umieszczaj nowej nazwy w nawiasach kwadratowych! w przeciwnym razie tabela będzie miała nawiasy kwadratowe W nazwie. A więc: „nazwa_tabeli” - jest poprawna, „[nazwa_tabeli]”
wpędzi
143

Aby zmienić nazwę kolumny:

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

Aby zmienić nazwę tabeli:

sp_rename 'old_table_name','new_table_name';
Ravi Kumar
źródło
Nie wyjaśnia, jak obsługiwać schematy inne niż domyślne dbo.
Sal
1
@Sal Nie mniej niż jakakolwiek inna odpowiedź tutaj? Czy szukałeś sposobu zmiany schematu tabeli ?
Bacon Bits,
14

Korzystając ze sp_rename, która działa jak w powyższych odpowiedziach, sprawdź także, które obiekty ulegają zmianie po zmianie nazwy, które odwołują się do tej tabeli, ponieważ musisz je również zmienić

Wziąłem przykład kodu dla zależności tabeli na blogu Pinal Dave tutaj

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'

Dlatego wszystkie te zależne obiekty również wymagają aktualizacji

Lub użyj jakiegoś dodatku, jeśli możesz, niektóre z nich mają funkcję zmiany nazwy obiektu, a wszystkie zależą również od obiektów


źródło
11

Jeśli spróbujesz exec sp_renameotrzymać błąd LockMatchID, może pomóc najpierw dodać instrukcję use [baza danych]:

próbowałem

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

To, co musiałem zrobić, aby to naprawić, to przepisać na:

use database_name
exec sp_rename '[dbo].[table_name]', 'new_table_name';
Stian
źródło
10

Nazwa tabeli

sp_rename 'db_name.old_table_name', 'new_table_name'

Kolumna

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

Indeks

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

dostępne również dla statystyk i typów danych

budamivardi
źródło
2
W kolumnie nie ma przecinka między pierwszym a drugim parametrem. Powinno to być: nazwa_sp. „Nazwa_bazy_dobej.nazwa_tabeli.nazwa”, „nazwa_użytkownika”, „KOLUMNA”
sebastian.roibu
7

Oto, czego używam:

EXEC sp_rename 'MyTable', 'MyTableNewName';
Sylvain Rodrigue
źródło
0

Nic z tego nie działało. Więc po prostu umieściłem dane w nowej tabeli

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

może przyda się komuś ...

W moim przypadku nie rozpoznałem nowego schematu, a właściciel był również dbo.

AKTUALIZACJA

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

Pracował dla mnie. Znalazłem go ze skryptu wygenerowanego automatycznie podczas aktualizacji PK dla jednej z tabel. W ten sposób rozpoznał także nowy schemat.

Cwi Gregory Kaidanov
źródło
0

Aby zmienić nazwę tabeli za pomocą innego schematu:

Przykład: Zmień dbo.MyTable1 na wrk.MyTable2

EXEC SP_RENAME 'dbo.MyTable1', 'MyTable2'

ALTER SCHEMA wrk TRANSFER dbo.MyTable2
żywa miłość
źródło