วิธีการเปลี่ยนชื่อตารางใน SQL Server


369

SQLแบบสอบถามที่ฉันได้ใช้เป็น:

ALTER TABLE oldtable RENAME TO newtable;

แต่มันทำให้ฉันมีข้อผิดพลาด

เซิร์ฟเวอร์: ข่าวสารเกี่ยวกับ 156 ระดับ 15 สถานะ 1 บรรทัดที่ 1
ไวยากรณ์ไม่ถูกต้องใกล้กับคำหลัก 'ถึง'

คำตอบ:


683

ในการเปลี่ยนชื่อตารางใน SQL Server ให้ใช้sp_renameคำสั่ง:

exec sp_rename 'schema.old_table_name', 'new_table_name'

7
อีกอย่างหนึ่ง: หากชื่อตารางใด ๆ มีชื่อ.อยู่ในนั้นให้ใช้[]รอบชื่อตาราง (ฉันรู้ว่าฉันรู้ แต่จุดที่สามารถเกิดขึ้น ... ) เช่นsp_rename '[Stupid.name]', 'NewName'หรือสคีsp_rename '[dbo.Stupid.name]', 'NewName'
vacip

55
และเพื่อเพิ่มไม่ได้ตั้งใจใส่คีมาในที่สนามมิฉะนั้นตารางของคุณอาจจะจบลงมองสิ่งที่ต้องการ'NewName' dbo.dbo.NewName
Michael Plautz

4
โปรดทราบว่าเมื่อเปลี่ยนชื่อตารางคุณเกือบจะต้องการเปลี่ยนชื่อการอ้างอิงใด ๆ ไปยังตารางที่อาจมีอยู่ในขั้นตอนการจัดเก็บมุมมองฟังก์ชั่น ฯลฯ ที่เก็บไว้ google อย่างรวดเร็วสามารถค้นหาหนึ่งในเครื่องมือมากมายที่สามารถทำได้สำหรับคุณ . หรือคุณสามารถใช้สคริปต์ที่ค้นหาสตริงที่กำหนดในวัตถุเหล่านี้ทั้งหมดและวางเป็นคำสั่ง ALTER และทำการค้นหาและแทนที่จากนั้นเรียกใช้ทั้งหมด
MGOwen

2
นอกจากนี้คุณยังสามารถสร้างคำพ้องความหมายตั้งชื่อตามชื่อตารางเก่าที่ชี้ไปที่ตารางใหม่CREATE SYNONYM [schema].[synonymName] FOR [schema].[tableName]
Ruskin

อย่าวางชื่อใหม่ในวงเล็บเหลี่ยม! มิฉะนั้นตารางจะมีวงเล็บเหลี่ยมอยู่ในชื่อ ดังนั้น: 'new_table_name' - ถูกต้อง '[new_table_name]' - จะทำให้คุณเดือดร้อน
VeganHunter

143

วิธีเปลี่ยนชื่อคอลัมน์:

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

วิธีเปลี่ยนชื่อตาราง:

sp_rename 'old_table_name','new_table_name';

ไม่อธิบายวิธีจัดการ schema อื่น ๆ นอกเหนือจาก dbo เริ่มต้น
Sal

1
@Sal ไม่น้อยไปกว่าคำตอบอื่น ๆ ที่นี่? คุณกำลังมองหาวิธีเปลี่ยนสคีมาของตารางหรือไม่?
เบคอนบิต

14

เมื่อใช้ sp_rename ที่ทำงานเหมือนคำตอบข้างต้นให้ตรวจสอบว่าวัตถุใดที่ได้รับผลกระทบหลังจากเปลี่ยนชื่ออ้างอิงตารางนั้นเพราะคุณต้องเปลี่ยนสิ่งเหล่านั้นด้วย

ฉันเอาตัวอย่างรหัสสำหรับการอ้างอิงตารางที่บล็อกของ Pinal Dave มาที่นี่

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'

ดังนั้นวัตถุที่อ้างถึงทั้งหมดเหล่านี้จำเป็นต้องได้รับการปรับปรุงด้วย

หรือใช้ Add-in บางตัวหากทำได้บางอันมีคุณสมบัติในการเปลี่ยนชื่อวัตถุและทุกอย่างขึ้นอยู่กับวัตถุด้วย


11

หากคุณลองexec sp_renameและรับข้อผิดพลาด LockMatchID มันอาจช่วยในการเพิ่มคำสั่ง [ฐานข้อมูล] ก่อน:

ฉันเหนื่อย

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

สิ่งที่ฉันต้องทำเพื่อแก้ไขมันคือเขียนมันใหม่:

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

10

ชื่อตาราง

sp_rename 'db_name.old_table_name', 'new_table_name'

คอลัมน์

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

ดัชนี

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

ยังมีให้สำหรับสถิตศาสตร์และประเภทข้อมูล


2
สำหรับคอลัมน์คุณไม่มีเครื่องหมายจุลภาคระหว่างพารามิเตอร์ตัวแรกและตัวที่สอง ควรเป็น: sp_rename 'db_name.old_table_name.name', 'userName', 'COLUMN'
sebastian.roibu


0

ไม่มีอะไรทำงานจากการเสนอที่นี่ .. ดังนั้นเพียงเจาะข้อมูลลงในตารางใหม่

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

อาจจะมีประโยชน์สำหรับใครบางคน ..

ในกรณีของฉันมันไม่รู้จัก schema ใหม่เช่นกัน dbo เป็นเจ้าของ ..

UPDATE

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

ทำงานให้ฉัน ฉันพบมันจากสคริปต์ที่สร้างขึ้นโดยอัตโนมัติเมื่ออัปเดต PK สำหรับหนึ่งในตาราง วิธีนี้จะรับรู้สคีมาใหม่เช่นกัน ..


0

ในการเปลี่ยนชื่อตารางด้วยสคีมาที่ต่างกัน:

ตัวอย่าง: เปลี่ยน dbo.MyTable1 เป็น wrk.MyTable2

EXEC SP_RENAME 'dbo.MyTable1', 'MyTable2'

ALTER SCHEMA wrk TRANSFER dbo.MyTable2
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.