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”.

Odpowiedzi:


683

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

exec sp_rename 'schema.old_table_name', 'new_table_name'

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';

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


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';

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


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


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.