เปลี่ยนชื่อคอลัมน์ SQL Server 2008


653

ฉันใช้ SQL Server 2008 และ Navicat ฉันต้องการเปลี่ยนชื่อคอลัมน์ในตารางโดยใช้ SQL

ALTER TABLE table_name RENAME COLUMN old_name to new_name;

คำสั่งนี้ไม่ทำงาน



5
โปรดทราบว่านี่ไม่ใช่คำถามที่ซ้ำกัน # 174582 ซึ่งเชื่อมโยงกับ swetha: อันนี้เป็น MS SQL เฉพาะ, อันนั้นเป็นฐานข้อมูลไม่เชื่อเรื่องพระเจ้า

คำตอบ:


1195

ใช้ sp_rename

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

โปรดดูที่: SQL Server - วิธีเปลี่ยนชื่อคอลัมน์หรือชื่อตาราง

เอกสารประกอบ: sp_rename (Transact-SQL)

สำหรับกรณีของคุณมันจะเป็น:

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

อย่าลืมใช้เครื่องหมายคำพูดเดี่ยวเพื่อใส่ค่าของคุณ


24
โปรดทราบว่าคุณไม่ควรใส่ NewColumnName ในวงเล็บเนื่องจาก SQL Server จะใช้ [[[NewColumnName]]] เป็นชื่อของคอลัมน์ใหม่ นอกจากนี้ sp_rename ควรขึ้นต้นด้วย EXEC หรือ EXECUTE
Mark Freeman

29
คุณได้รับอนุญาตและสนับสนุนให้ใส่วงเล็บในพารามิเตอร์แรกระบุคอลัมน์ แต่ไม่ได้อยู่ในพารามิเตอร์ที่สอง เช่นนี้:EXEC sp_RENAME '[TableName].[OldColumnName]', 'NewColumnName', 'COLUMN'
Niels Brinch

2
คุณควรสังเกตคำตอบของคุณว่าขั้นตอนการจัดเก็บนี้จัดการค่าเริ่มต้นข้อ จำกัดโมฆะ ฯลฯขณะทำการเปลี่ยนชื่อซึ่งตรงข้ามกับธรรมดาalter tableที่จะล้มเหลวหากมีข้อ จำกัด ดังกล่าว
Tuncay Göncüoğlu

4
โปรดทราบว่าถ้าคุณใช้ 'table_name.new_name' มันจะกลายเป็น [schema] [table_name] [table_name.new_name] - ดังนั้นอย่าใส่ชื่อตารางนั้นในชื่อใหม่! (มันเป็นคำตอบที่ถูกต้องในนี้เพียงแค่เพิ่มบันทึกสำหรับ peeps ก)
มาร์ค Schultheiss

1
หากมีสคีในฐานข้อมูลที่คุณต้องใส่ชื่อสกีมาก่อนชื่อตาราง: EXEC sp_RENAME 'schema_name.table_name.old_name', 'new_name', 'คอลัมน์'
อามิน

106

หรือจะไป SQLที่คุณสามารถทำเช่นนี้ใน Microsoft SQL Server Studio จัดการ ต่อไปนี้คือวิธีใช้ GUI อย่างรวดเร็ว:

วิธีแรก

ช้าดับเบิลคลิกที่คอลัมน์ ชื่อคอลัมน์จะกลายเป็นกล่องข้อความที่แก้ไขได้


วิธีที่สอง

คลิกขวาที่คอลัมน์และเลือกเปลี่ยนชื่อจากเมนูบริบท

ตัวอย่างเช่น:

เพื่อเปลี่ยนชื่อคอลัมน์


วิธีที่สาม

วิธีนี้จะดีกว่าเมื่อคุณต้องการเปลี่ยนชื่อหลายคอลัมน์ในครั้งเดียว

  1. คลิกขวาบนตารางที่มีคอลัมน์ที่ต้องการเปลี่ยนชื่อ
  2. คลิกที่การออกแบบ
  3. ในแผงการออกแบบตารางคลิกและแก้ไขกล่องข้อความของชื่อคอลัมน์ที่คุณต้องการแก้ไข

ตัวอย่างเช่น: ตัวอย่างการออกแบบตาราง MSSMS

หมายเหตุ:ฉันรู้ว่า OP ขอวิธีแก้ปัญหา SQL โดยเฉพาะคิดว่าอาจช่วยคนอื่นได้ :)


1
หรือผู้ใช้ไม่มีสิทธิ์
Carrie Kendall

6
ไม่เคยทำอย่างนั้น คุณกำลังคัดลอกตารางแล้ววางเก่าและเปลี่ยนชื่อ ไม่เคยใช้ GUI EVER เพื่อเปลี่ยนแปลงอะไรเกี่ยวกับตาราง
HLGEM

6
@ HLGEM นั่นเป็นคำสั่งผ้าห่มขนาดใหญ่ที่น่ารัก คุณสามารถให้ทรัพยากรใด ๆ กับสิ่งที่คุณอธิบายได้หรือไม่? เช่นวางโต๊ะ ฯลฯ
Carrie Kendall

2
@CarrieKendall เขียนสคริปต์การเปลี่ยนแปลงจาก GUI แทนที่จะทำและคุณจะเห็น นี่คือเหตุผลที่ช้ากว่ามากในการเปลี่ยนแปลงการใช้ GUI กับตารางขนาดใหญ่กว่าผ่านการใช้ sp_rename หรือแก้ไขตาราง นอกจากนี้การเปลี่ยนแปลงโครงสร้างฐานข้อมูลเป็นการเปลี่ยนแปลงรหัสและควรอยู่ในการควบคุมซอร์สเช่นรหัสอื่นดังนั้นควรอยู่ในสคริปต์ นี่เป็นสิ่งสำคัญอย่างยิ่งหากคุณไม่อนุญาตให้มีสิทธิ์ในฐานข้อมูลการผลิต dev เพื่อเปลี่ยนตารางเนื่องจากคุณจะต้องใช้สคริปต์ในทุกกรณี และคุณไม่ต้องการไปเกี่ยวกับการคัดลอกวางและสร้างตารางใหม่ด้วยบันทึกนับล้านรายการใน prod
HLGEM

18
ฉันเพิ่งเปลี่ยนชื่อตาราง SQL Server 2012 โดยใช้ Management Studio ที่มีการเรียกใช้ profiler และใช้ sp_rename ไม่สามารถพูดถึงรุ่นก่อนหน้านี้ได้
Steve Dowling


27

คุณควรระบุสคีมาของตารางหรือคุณอาจได้รับข้อผิดพลาดนี้:

ข่าวสารเกี่ยวกับ 15248, ระดับ 11, สถานะ 1, โพรซีเดอร์ sp_rename, บรรทัด 238 พารามิเตอร์ @objname ไม่ชัดเจนหรือ @objtype ที่อ้างสิทธิ์ (COLUMN) ผิด

หากเป็นสคริปต์การปรับใช้ฉันขอแนะนำให้เพิ่มความปลอดภัยเพิ่มเติม

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

ฉันชอบวิธีการที่ปลอดภัยนี้ดีสำหรับการเขียนการย้ายข้อมูลซึ่งอาจ / อาจไม่ทำงานในสภาพแวดล้อมที่แตกต่างกัน
Adil H. Raza

เช่นเดียวกับการตรวจสอบการดำรงอยู่ทำให้ฉันรู้สึกว่าการเรียกใช้อีกครั้งเป็นส่วนหนึ่งของสคริปต์อื่น ๆ
ทราบแน่ชัด

19

มันจะเป็นคำแนะนำที่ดีในการใช้ฟังก์ชั่นที่มีอยู่แล้ว แต่อีกวิธีคือ:

  1. สร้างคอลัมน์ใหม่ด้วยชนิดข้อมูลเดียวกันและใหม่ชื่อ
  2. เรียกใช้คำสั่ง UPDATE / INSERT เพื่อคัดลอกข้อมูลทั้งหมดลงในคอลัมน์ใหม่
  3. วางคอลัมน์เก่า

ประโยชน์ที่ได้รับจากการใช้ sp_renameคือการดูแลความสัมพันธ์ทั้งหมดที่เกี่ยวข้อง

จากเอกสาร :

sp_rename เปลี่ยนชื่อดัชนีที่เกี่ยวข้องโดยอัตโนมัติทุกครั้งที่มีการเปลี่ยนชื่อคีย์หลักหรือข้อ จำกัด UNIQUE หากดัชนีที่ถูกเปลี่ยนชื่อนั้นเชื่อมโยงกับข้อ จำกัด ของคีย์หลักข้อ จำกัด ของคีย์หลักจะถูกเปลี่ยนชื่อโดยอัตโนมัติด้วย sp_rename sp_rename สามารถใช้เพื่อเปลี่ยนชื่อดัชนี XML หลักและรอง


* ในขั้นตอนที่ 1 NULL จะต้องได้รับอนุญาตในคอลัมน์ใหม่ทางเลือก * เพิ่มขั้นตอนที่ 4 เพื่อเปลี่ยนคอลัมน์ใหม่ว่าจะไม่อนุญาตให้ค่า NULL
BitLauncher

16

คุณสามารถใช้sp_renameเพื่อเปลี่ยนชื่อคอลัมน์

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

พารามิเตอร์แรกคือวัตถุที่จะปรับเปลี่ยนพารามิเตอร์ที่สองเป็นชื่อใหม่ที่จะได้รับวัตถุและพารามิเตอร์ที่สามคอลัมน์แจ้งเซิร์ฟเวอร์ที่เปลี่ยนชื่อเป็นสำหรับcolumnและยังสามารถใช้ในการเปลี่ยนชื่อtables, และindexalias data type


2
ไม่เข้าใจทำไมคุณจึงเพิ่มคำตอบใหม่ที่สูงกว่า 4 ใน 5 ที่กล่าวถึง sp_rename ...
Pawel Czapski

3
ในบางจุดใครบางคนจะต้องอธิบายการทำงานของพารามิเตอร์ที่นี่ไม่มีใครทำเช่นนี้
Alexandre Neukirchen

1
ใช่คุณพูดถูกจริงๆสำหรับฉันมันชัดเจนมาก แต่สำหรับเด็กใหม่อาจไม่ใช่
Pawel Czapski

12

เนื่องจากฉันมักจะมาที่นี่และสงสัยว่าจะใช้วงเล็บได้อย่างไรคำตอบนี้อาจมีประโยชน์สำหรับคนที่ชอบฉัน

EXEC sp_rename '[DB].[dbo].[Tablename].OldColumnName', 'NewColumnName', 'COLUMN'; 
  • ต้องไม่อยู่ในOldColumnName []มันจะไม่ทำงาน
  • ไม่ใส่NewColumnNameเข้าไปก็จะส่งผลในการ[][[NewColumnName]]

3

สตูดิโอการจัดการ SQL Server มีระบบที่กำหนดไว้บางขั้นตอนการจัดเก็บ (SP)
หนึ่งในนั้นถูกใช้เพื่อเปลี่ยนชื่อคอลัมน์ SP คือsp_rename

ไวยากรณ์: sp_rename '[table_name] .old_column_name', 'new_column_name'
สำหรับความช่วยเหลือเพิ่มเติมอ้างอิงบทความนี้: sp_rename โดย Microsoft Docs

หมายเหตุ:ในการประมวลผล SP นี้เซิร์ฟเวอร์ sql จะให้ข้อความเตือนเป็น 'ข้อควรระวัง: การเปลี่ยนส่วนใด ๆ ของชื่อวัตถุอาจทำให้สคริปต์และขั้นตอนการจัดเก็บเสียหาย' นี่เป็นสิ่งสำคัญเฉพาะเมื่อคุณเขียน sp ของคุณเองซึ่งเกี่ยวข้องกับคอลัมน์ ในตารางที่คุณกำลังจะเปลี่ยน


2

รุ่นที่ได้รับการปรับปรุงของ @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

0

หรือคุณสามารถคลิกช้าสองครั้งที่คอลัมน์ใน SQL Management Studio และเปลี่ยนชื่อมันผ่าน UI ...


-1

เรียกใช้แบบสอบถาม:

    SP_RENAME '[TableName].[ColumnName]','NewNameForColumn'

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