Tambahkan kolom ke tabel, jika belum ada

188

Saya ingin menulis kueri untuk MS SQL Server yang menambahkan kolom ke dalam tabel. Tapi saya tidak ingin tampilan kesalahan, ketika saya menjalankan / menjalankan permintaan berikut.

Saya menggunakan kueri semacam ini untuk menambahkan tabel ...

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

Tapi saya tidak tahu cara menulis kueri ini untuk kolom.

Tavousi
sumber
1
kemungkinan duplikat dari Cara memeriksa apakah kolom ada di tabel SQL Server
Martin Smith
Anda harus menggunakan sys.tablesalih-alih "generik" sys.objects- maka Anda tidak perlu menentukan jenis secara eksplisit (sudah jelas dari yang sys.tablessudah ....)
marc_s
COL_LENGTH Alternatif hanya berfungsi dari SQL-Server 2008, tetapi berfungsi.
Paul-Henri

Jawaban:

219

Anda dapat menggunakan konstruksi yang sama dengan menggunakan sys.columnstabel io sys.objects.

IF NOT EXISTS (
  SELECT * 
  FROM   sys.columns 
  WHERE  object_id = OBJECT_ID(N'[dbo].[Person]') 
         AND name = 'ColumnName'
)
Letnan Keersmaekers
sumber
42
Perhatikan bahwa dalam contoh ini Anda ingin menggunakan JIKA TIDAK ADA dalam kode Anda yang sebenarnya.
Nat
2
Untuk kueri yang dioptimalkan, Anda dapat menggunakan 1 teratas dengan pernyataan pilih
Banketeshvar Narayan
11
@BanketeshvarNarayan ini tidak benar. Rencana eksekusi untuk subquery dalam EXISTSklausa identik. Hal-hal suka SELECT 1atau SELECT TOP 1tidak perlu. The EXISTSklausul itu sendiri menceritakan query optimizer hanya melakukan minimum membaca diperlukan untuk mengevaluasi EXISTS... setidaknya di SQL Server. Mesin DB lainnya mungkin memiliki pengoptimal permintaan yang lebih atau kurang efisien.
Kenneth Cochran
9
@BanketeshvarNarayan Jika Anda mengoptimalkan ADD Columnpertanyaan Anda ... Anda harus menjalankannya terlalu sering!
Fenton
1
@ user391339 - Saya telah memposting konstruksi yang sama dengan OP yang diposting tetapi ya, jika Anda ingin mengambil tindakan jika kolom tidak ada, pernyataannya adalah JIKA TIDAK ADA. Saya tidak benar-benar merasa perlu mengedit jawaban untuk ini, tetapi jangan ragu untuk mengedit diri sendiri jika Anda pikir ini merupakan peningkatan.
Lieven Keersmaekers
91
IF COL_LENGTH('table_name', 'column_name') IS NULL
BEGIN
    ALTER TABLE table_name
    ADD [column_name] INT
END
SPL
sumber
1
Saya mencoba melakukan ini tetapi ia mengembalikan kesalahan yang menyatakan bahwa fungsi COL_LENGTH tidak ada.
ThEpRoGrAmMiNgNoOb
3
Membutuhkan SQL Server 2008+
Robert Brown
6
Tambahan kecil - orang tidak boleh menggunakan tanda kurung siku dalam nama kolom, karena COL_LENGTH('table_name', '[column_name]')selalu mengembalikan nol di SQL Server 2016 ( COL_LENGTH('[table_name]', 'column_name') works as expected).
stop-cran
33

Alternatif lain. Saya lebih suka pendekatan ini karena kurang menulis tetapi keduanya mencapai hal yang sama.

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

Saya juga memperhatikan bahwa Anda sedang mencari di mana meja ada yang jelas hanya ini

 if COLUMNPROPERTY( OBJECT_ID('dbo.Person'),'ColumnName','ColumnId') is not null
JStead
sumber
2
Saya suka itu. Saya pikir bagian terbaik tentang memposting di sini adalah menemukan permata seperti ini.
JStead
2
Apa itu 'ColumnId'?
Marius Stănescu
'ColumnId' adalah nama properti kolom yang Anda periksa. Anda mungkin dapat menggunakan nama properti apa pun yang ada di kolom, seperti nama, dll.
Jacques Bosch
5

Berikut variasi lain yang berfungsi untuk saya.

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

EDIT: Perhatikan bahwa INFORMATION_SCHEMAtampilan mungkin tidak selalu diperbarui, gunakan SYS.COLUMNSsebaliknya:

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

Adil H. Raza
sumber
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

Semoga ini bisa membantu. Info lebih lanjut

ShaileshDev
sumber
Ini bekerja untuk saya di SqlServer 2000 sedangkan jawaban yang diterima tidak. Tampilan sys. * Tampaknya telah ditambahkan di sekitar SqlServer 2005, lih. docs.microsoft.com/en-us/sql/relational-databases/…
ZeRemz
0

Saat memeriksa kolom di basis data lain, Anda cukup memasukkan nama basis data:

IF NOT EXISTS (
  SELECT * 
  FROM   DatabaseName.sys.columns 
  WHERE  object_id = OBJECT_ID(N'[DatabaseName].[dbo].[TableName]') 
         AND name = 'ColumnName'
)
Ezra
sumber
-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
Kode Pertama
sumber