เพิ่มคอลัมน์ในตารางหากยังไม่มีอยู่


188

ฉันต้องการเขียนแบบสอบถามสำหรับ MS SQL Server ที่เพิ่มคอลัมน์ลงในตาราง แต่ฉันไม่ต้องการแสดงข้อผิดพลาดใด ๆ เมื่อฉันเรียกใช้ / ดำเนินการแบบสอบถามต่อไปนี้

ฉันใช้คิวรีประเภทนี้เพื่อเพิ่มตาราง ...

IF EXISTS (
       SELECT *
       FROM   sys.objects
       WHERE  OBJECT_ID = OBJECT_ID(N'[dbo].[Person]')
              AND TYPE IN (N'U')
   )

แต่ฉันไม่รู้วิธีเขียนแบบสอบถามนี้สำหรับคอลัมน์



คุณควรใช้sys.tablesแทน "generic" sys.objects- จากนั้นคุณไม่จำเป็นต้องระบุประเภทอย่างชัดเจน (มันชัดเจนจากที่sys.tablesแล้ว .... )
marc_s

COL_LENGTH ทางเลือกทำงานได้เฉพาะจาก SQL-Server 2008 แต่ใช้งานได้
Paul-Henri

คำตอบ:


219

คุณสามารถใช้โครงสร้างที่คล้ายกันโดยใช้sys.columnsตาราง sys.objectsio

IF NOT EXISTS (
  SELECT * 
  FROM   sys.columns 
  WHERE  object_id = OBJECT_ID(N'[dbo].[Person]') 
         AND name = 'ColumnName'
)

42
โปรดทราบว่าในกรณีนี้คุณต้องการใช้ IF NOT EXISTS ในรหัสจริงของคุณ
Nat

2
สำหรับการค้นหาที่ดีที่สุดคุณสามารถใช้ 1 อันดับแรกกับคำสั่งที่เลือก
Banketeshvar Narayan

11
@BanketeshvarNarayan สิ่งนี้ไม่ถูกต้อง แผนการดำเนินการสำหรับเคียวรีย่อยในEXISTSข้อเหมือนกัน สิ่งที่ชอบSELECT 1หรือSELECT TOP 1ไม่จำเป็น ส่วนEXISTSคำสั่งเองบอกให้เครื่องมือเพิ่มประสิทธิภาพการสืบค้นทำการอ่านขั้นต่ำที่จำเป็นในการประเมินEXISTS... อย่างน้อยใน SQL Server เอ็นจิ้นฐานข้อมูลอื่นอาจมีตัวเพิ่มประสิทธิภาพการสืบค้นที่มีประสิทธิภาพมากกว่าหรือน้อยกว่า
Kenneth Cochran

9
@BanketeshvarNarayan หากคุณเพิ่มประสิทธิภาพการADD Columnค้นหาของคุณ... คุณต้องเรียกใช้บ่อยเกินไป!
เฟนตัน

1
@ user391339 - ฉันได้โพสต์โครงสร้างที่คล้ายกันกับ OP ที่โพสต์ แต่ใช่ถ้าคุณต้องการดำเนินการหากคอลัมน์ไม่มีอยู่คำสั่งจะเป็น IF NOT EXISTS ฉันไม่รู้สึกว่าจำเป็นต้องแก้ไขคำตอบสำหรับสิ่งนี้ แต่อย่าลังเลที่จะแก้ไขตัวเองหากคุณคิดว่าเป็นการปรับปรุง
Lieven Keersmaekers

91
IF COL_LENGTH('table_name', 'column_name') IS NULL
BEGIN
    ALTER TABLE table_name
    ADD [column_name] INT
END

1
ฉันพยายามทำสิ่งนี้ แต่ส่งคืนข้อผิดพลาดซึ่งระบุว่าฟังก์ชัน COL_LENGTH ไม่มีอยู่
ThEpRoGrAmMiNgNoOb

3
ต้องใช้ SQL Server 2008+
Robert Brown

6
การเพิ่มเล็ก - หนึ่งไม่ควรใช้วงเล็บเหลี่ยมในชื่อคอลัมน์เนื่องจากCOL_LENGTH('table_name', '[column_name]')ส่งคืน null ใน SQL Server 2016 ( COL_LENGTH('[table_name]', 'column_name') works as expected) เสมอ
หยุดประจำ

33

ทางเลือกอื่น ฉันชอบวิธีนี้เพราะมันเขียนน้อยกว่า แต่ทั้งสองทำสิ่งเดียวกัน

IF COLUMNPROPERTY(OBJECT_ID('dbo.Person'), 'ColumnName', 'ColumnId') IS NULL
BEGIN
    ALTER TABLE Person 
    ADD ColumnName VARCHAR(MAX) NOT NULL
END

ฉันยังสังเกตเห็นว่าคุณกำลังมองหาตารางที่มีอยู่ที่เห็นได้ชัดเพียงแค่นี้

 if COLUMNPROPERTY( OBJECT_ID('dbo.Person'),'ColumnName','ColumnId') is not null

2
ฉันชอบมัน. ฉันคิดว่าส่วนที่ดีที่สุดเกี่ยวกับการโพสต์ที่นี่คือการค้นหาอัญมณีเช่นนี้
JStead

2
'ColumnId' คืออะไร
Marius Stănescu

'ColumnId' เป็นชื่อของคุณสมบัติคอลัมน์ที่คุณกำลังตรวจสอบ คุณจะได้ใช้อาจจะชื่อคุณสมบัติใด ๆ ที่มีอยู่บนคอลัมน์เช่นชื่อ, ฯลฯ
ฌาคส์บ๊อช

5

นี่คือรูปแบบอื่นที่เหมาะกับฉัน

IF NOT EXISTS (SELECT 1
        FROM INFORMATION_SCHEMA.COLUMNS
        WHERE upper(TABLE_NAME) = 'TABLENAME'
        AND upper(COLUMN_NAME) = 'COLUMNNAME')
BEGIN
    ALTER TABLE [dbo].[Person] ADD Column
END
GO

แก้ไข: โปรดทราบว่าINFORMATION_SCHEMAมุมมองอาจไม่ได้รับการปรับปรุงให้ใช้SYS.COLUMNSแทน:

IF NOT EXISTS (SELECT 1 FROM SYS.COLUMNS....


0
IF NOT EXISTS (SELECT * FROM syscolumns
  WHERE ID=OBJECT_ID('[db].[Employee]') AND NAME='EmpName')
  ALTER TABLE [db].[Employee]
  ADD [EmpName] VARCHAR(10)
GO

ฉันหวังว่านี่จะช่วยได้ ข้อมูลเพิ่มเติม


สิ่งนี้ใช้ได้กับฉันใน SqlServer 2000 ในขณะที่คำตอบที่ยอมรับไม่ได้ ดูเหมือนว่ามีการเพิ่มมุมมอง sys. * รอบ ๆ SqlServer 2005, cf. docs.microsoft.com/en-us/sql/relational-database/…
ZeRemz

0

เมื่อตรวจสอบคอลัมน์ในฐานข้อมูลอื่นคุณสามารถรวมชื่อฐานข้อมูลได้:

IF NOT EXISTS (
  SELECT * 
  FROM   DatabaseName.sys.columns 
  WHERE  object_id = OBJECT_ID(N'[DatabaseName].[dbo].[TableName]') 
         AND name = 'ColumnName'
)

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