Bagaimana cara mengganti nama tabel di SQL Server?

370

The SQLquery yang saya gunakan adalah:

ALTER TABLE oldtable RENAME TO newtable;

Tapi, itu memberi saya kesalahan.

Server: Msg 156, Level 15, Status 1, Baris 1
Sintaks salah di dekat kata kunci 'TO'.

Beralih
sumber

Jawaban:

683

Untuk mengganti nama tabel di SQL Server, gunakan sp_renameperintah:

exec sp_rename 'schema.old_table_name', 'new_table_name'
Jeff Hornby
sumber
7
Satu hal lagi: jika ada nama tabel .di dalamnya, gunakan di []sekitar nama tabel. (Saya tahu, saya tahu, tetapi titik-titik dapat terjadi ...) Misalnya sp_rename '[Stupid.name]', 'NewName'atau dengan skemasp_rename '[dbo.Stupid.name]', 'NewName'
vacip
55
Dan untuk menambahkan, jangan secara tidak sengaja meletakkan skema di 'NewName'bidang, jika tidak meja Anda mungkin terlihat seperti dbo.dbo.NewName.
Michael Plautz
4
Ingatlah bahwa ketika mengganti nama tabel, Anda hampir pasti ingin juga mengganti nama referensi ke tabel itu yang mungkin ada dalam prosedur tersimpan, tampilan, fungsi, dll . Google cepat dapat menemukan salah satu dari banyak alat yang dapat melakukan ini untuk Anda . Atau Anda dapat menggunakan skrip yang menemukan string yang diberikan di semua objek ini, dan menempelkannya sebagai pernyataan ALTER, dan melakukan temukan-dan-ganti, lalu jalankan semuanya.
MGOwen
2
Anda juga dapat membuat sinonim dari nama tabel lama yang menunjuk ke tabel baruCREATE SYNONYM [schema].[synonymName] FOR [schema].[tableName]
Ruskin
jangan letakkan nama baru di dalam kurung siku! jika tidak, tabel akan memiliki tanda kurung DALAM namanya. Jadi: 'new_table_name' - benar, '[new_table_name]' - akan membuat Anda mendapat masalah
VeganHunter
143

Untuk mengganti nama kolom:

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

Untuk mengganti nama tabel:

sp_rename 'old_table_name','new_table_name';
Ravi Kumar
sumber
Tidak menjelaskan cara menangani skema selain dbo default.
Sal
1
@ Sal Tidak kurang dari jawaban lain di sini? Apakah Anda mencari cara mengubah skema tabel ?
Bacon Bits
14

Saat menggunakan sp_rename yang berfungsi seperti pada jawaban di atas, periksa juga objek mana yang terpengaruh setelah penamaan ulang, yang merujuk pada tabel itu, karena Anda perlu mengubahnya juga

Saya mengambil contoh kode untuk dependensi tabel di blog Pinal Dave di sini

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'

Jadi, semua objek dependen ini perlu diperbarui juga

Atau gunakan beberapa tambahan jika Anda bisa, beberapa dari mereka memiliki fitur untuk mengubah nama objek, dan semua tergantung, objek juga


sumber
11

Jika Anda mencoba exec sp_renamedan menerima kesalahan LockMatchID maka mungkin membantu menambahkan pernyataan penggunaan [database] terlebih dahulu:

Saya mencoba

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

Apa yang harus saya lakukan untuk memperbaikinya adalah menulis ulang untuk:

use database_name
exec sp_rename '[dbo].[table_name]', 'new_table_name';
Stian
sumber
10

Nama Tabel

sp_rename 'db_name.old_table_name', 'new_table_name'

Kolom

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

Indeks

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

juga tersedia untuk statika dan tipe data

budamivardi
sumber
2
Untuk Kolom Anda kehilangan koma antara parameter pertama dan kedua. Seharusnya: sp_rename 'db_name.old_table_name.name', 'userName', 'COLUMN'
sebastian.roibu
7

Inilah yang saya gunakan:

EXEC sp_rename 'MyTable', 'MyTableNewName';
Sylvain Rodrigue
sumber
0

Tidak ada yang berhasil dari yang diusulkan di sini .. Jadi hanya menengok data ke dalam tabel baru

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

mungkin akan bermanfaat bagi seseorang ..

Dalam kasus saya itu tidak mengenali skema baru juga dbo adalah pemiliknya ..

MEMPERBARUI

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

Bekerja untukku. Saya menemukannya dari skrip yang dihasilkan secara otomatis ketika memperbarui PK untuk salah satu tabel. Dengan cara ini ia mengenali skema baru juga ..

Tzvi Gregory Kaidanov
sumber
0

Untuk mengubah nama tabel dengan skema berbeda:

Contoh: Ubah dbo.MyTable1 menjadi wrk.MyTable2

EXEC SP_RENAME 'dbo.MyTable1', 'MyTable2'

ALTER SCHEMA wrk TRANSFER dbo.MyTable2
cinta hidup
sumber