Henüz yoksa bir tabloya sütun ekleme


188

Tabloya bir sütun ekleyen MS SQL Server için bir sorgu yazmak istiyorum. Ancak aşağıdaki sorguyu çalıştırdığımda / yürüttüğümde herhangi bir hata görüntüsü istemiyorum.

Tablo eklemek için bu tür bir sorgu kullanıyorum ...

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

Ama bir sütun için bu sorguyu yazmak nasıl bilmiyorum.



sys.tables"Genel" yerine kullanmalısınız sys.objects- o zaman türü açıkça belirtmeniz gerekmez ( sys.tableszaten açıktır ....)
marc_s

COL_LENGTH Alternatif yalnızca SQL-Server 2008'den çalışır, ancak çalışır.
Paul-Henri

Yanıtlar:


219

sys.columnsİo tablosunu kullanarak benzer bir yapı kullanabilirsiniz sys.objects.

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

42
Bu durumda, gerçek kodunuzda EĞER DEĞİLSE kullanmak istediğinizi unutmayın.
Nat

2
Optimize sorgu için top deyimini select deyimiyle kullanabilirsiniz
Banketeshvar Narayan

11
@BanketeshvarNarayan bu yanlış. Bir cümledeki alt sorgular için yürütme planları EXISTSaynıdır. Gibi SELECT 1veya SELECT TOP 1gereksiz şeyler . EXISTSFıkra kendisi sadece asgari değerlendirmek için gerekli okur gerçekleştirmek için sorgu iyileştirici söyler EXISTSen azından SQL Server .... Diğer DB motorlarında az ya da çok etkili bir sorgu optimize edici bulunabilir.
Kenneth Cochran

9
@BanketeshvarNarayan ADD ColumnSorgularınızı optimize ediyorsanız ... bunları çok sık çalıştırmalısınız!
Fenton

1
@ user391339 - OP ile benzer bir yapı yayınladım ancak evet, sütun yoksa işlem yapmak istiyorsanız , ifade EĞER DEĞİLDİR. Bunun cevabını düzenleme ihtiyacını gerçekten hissetmiyorum, ancak bunun bir gelişme olduğunu düşünüyorsanız kendinizi düzenlemekten çekinmeyin.
Lieven Keersmaekers

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

1
Bunu yapmayı denedim ama COL_LENGTH işlevinin mevcut olmadığını bildiren bir hata döndürüyor.
Ocak 15:35, ThEpRoGrAmMiNgNoOb

3
SQL Server 2008+ gerektirir
Robert Brown

6
Küçük ekleme - COL_LENGTH('table_name', '[column_name]')SQL Server 2016'da her zaman null döndürdüğünden sütun adında köşeli parantez kullanılmamalıdır COL_LENGTH('[table_name]', 'column_name') works as expected.
stop-cran

33

Başka bir alternatif. Bu yaklaşımı tercih ediyorum çünkü daha az yazıyor ama ikisi de aynı şeyi yapıyor.

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

Ben de senin tablonun var olduğu yeri aradığını fark ettim ki bu sadece

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

2
Bunu sevdim. Bence burada gönderme ile ilgili en iyi bölüm böyle taşlar bulmak.
JStead

2
'ColumnId' nedir?
Marius Stănescu

'ColumnId', denetlediğiniz sütun özelliğinin adıdır. Muhtemelen bir sütunda ad, vb. Gibi herhangi bir özellik adı kullanmış olabilirsiniz
Jacques Bosch

5

İşte benim için çalışan başka bir varyasyon.

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

DÜZENLEME: INFORMATION_SCHEMAGörünümlerin her zaman güncellenmeyebileceğini unutmayın; SYS.COLUMNSbunun yerine şunu kullanın:

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



0

Başka bir veritabanındaki bir sütunu kontrol ederken, veritabanı adını dahil etmeniz yeterlidir:

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

-1
IF NOT EXISTS (SELECT 1  FROM SYS.COLUMNS WHERE  
OBJECT_ID = OBJECT_ID(N'[dbo].[Person]') AND name = 'DateOfBirth')
BEGIN
ALTER TABLE [dbo].[Person] ADD DateOfBirth DATETIME
END
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.