Pertanyaan Bagaimana cara memeriksa apakah ada kolom dalam tabel SQL Server?


Saya perlu menambahkan kolom tertentu jika tidak ada. Saya memiliki sesuatu seperti yang berikut, tetapi selalu mengembalikan salah:

IF EXISTS(SELECT *
          FROM   INFORMATION_SCHEMA.COLUMNS
          WHERE  TABLE_NAME = 'myTableName'
                 AND COLUMN_NAME = 'myColumnName') 

Bagaimana saya bisa memeriksa apakah ada kolom dalam tabel database SQL Server?


1567
2017-09-25 12:34


asal


Jawaban:


SQL Server 2005 dan seterusnya:

IF EXISTS(SELECT 1 FROM sys.columns 
          WHERE Name = N'columnName'
          AND Object_ID = Object_ID(N'schemaName.tableName'))
BEGIN
    -- Column Exists
END

Versi Martin Smith lebih pendek:

IF COL_LENGTH('schemaName.tableName', 'columnName') IS NOT NULL
BEGIN
    -- Column Exists
END

1722
2017-09-25 12:39



Versi yang lebih ringkas

 IF COL_LENGTH('table_name','column_name') IS NULL
 BEGIN
 /*Column does not exist or caller does not have permission to view the object*/
 END

Intinya tentang izin melihat metadata berlaku untuk semua jawaban bukan hanya yang satu ini.

Perhatikan bahwa nama tabel parameter pertama untuk COL_LENGTH bisa dalam format satu, dua, atau tiga bagian nama sesuai kebutuhan.

Contoh referensi tabel dalam database yang berbeda adalah

COL_LENGTH('AdventureWorks2012.HumanResources.Department','ModifiedDate')

Satu perbedaan dengan jawaban ini dibandingkan dengan menggunakan tampilan metadata adalah fungsi metadata seperti COL_LENGTH selalu hanya mengembalikan data tentang perubahan yang dilakukan terlepas dari tingkat isolasi yang berlaku.


853
2018-03-20 14:47



Tweak di bawah ini untuk memenuhi persyaratan spesifik Anda:

if not exists (select
                     column_name
               from
                     INFORMATION_SCHEMA.columns
               where
                     table_name = 'MyTable'
                     and column_name = 'MyColumn')
    alter table MyTable add MyColumn int

Edit untuk menangani pengeditan untuk pertanyaan: Itu harus bekerja - perhatikan dengan seksama kode Anda untuk kesalahan bodoh; apakah Anda meng-query INFORMATION_SCHEMA pada database yang sama dengan insert Anda sedang diterapkan misalnya? Apakah Anda memiliki kesalahan ketik di nama tabel / kolom dalam salah satu pernyataan?


125
2017-09-25 12:35



Coba ini...

IF NOT EXISTS(
  SELECT TOP 1 1
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE 
    [TABLE_NAME] = 'Employees'
    AND [COLUMN_NAME] = 'EmployeeID')
BEGIN
  ALTER TABLE [Employees]
    ADD [EmployeeID] INT NULL
END

63
2017-09-25 12:35



Saya lebih suka INFORMATION_SCHEMA.COLUMNS melalui tabel sistem karena Microsoft tidak menjamin untuk menjaga tabel sistem antar versi. Sebagai contoh, dbo.syscolumns masih berfungsi di SQL 2008, tetapi tidak lagi digunakan dan dapat dihapus kapan saja di masa mendatang.


43
2018-06-26 08:58



Anda dapat menggunakan tampilan sistem skema informasi untuk mengetahui banyak hal tentang tabel yang Anda minati:

SELECT *
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE TABLE_NAME = 'yourTableName'
 ORDER BY ORDINAL_POSITION

Anda juga dapat menginterogasi pandangan, prosedur yang tersimpan dan cukup banyak hal tentang database menggunakan tampilan Information_schema.


38
2017-09-25 12:37



Pertama periksa apakah table/column(id/name) kombinasi ada di dbo.syscolumns (tabel SQL Server internal yang berisi definisi bidang), dan jika tidak mengeluarkan yang sesuai ALTER TABLE permintaan untuk menambahkannya. Sebagai contoh:

IF NOT EXISTS ( SELECT  *
            FROM    syscolumns
            WHERE   id = OBJECT_ID('Client')
                    AND name = 'Name' ) 
ALTER TABLE Client
ADD Name VARCHAR(64) NULL

28
2017-09-25 12:38



Coba sesuatu seperti:

CREATE FUNCTION ColumnExists(@TableName varchar(100), @ColumnName varchar(100))
RETURNS varchar(1) AS
BEGIN
DECLARE @Result varchar(1);
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME = @TableName AND COLUMN_NAME = @ColumnName)
BEGIN
    SET @Result = 'T'
END
ELSE
BEGIN
    SET @Result = 'F'
END
RETURN @Result;
END
GO

GRANT EXECUTE ON  [ColumnExists] TO [whoever]
GO

Kemudian gunakan seperti ini:

IF ColumnExists('xxx', 'yyyy') = 'F'
BEGIN
  ALTER TABLE xxx
  ADD yyyyy varChar(10) NOT NULL
END
GO

Ini harus bekerja pada kedua SQL Server 2000 & SQL Server 2005. Tidak yakin tentang SQL Server 2008, tetapi tidak melihat mengapa tidak.


26
2018-05-01 04:46



Untuk orang-orang yang memeriksa keberadaan kolom untuk menjatuhkannya.

Di SQL Server 2016 Anda dapat menggunakan pernyataan DIE baru, bukan yang besar IF pembungkus

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

24
2018-03-03 15:49



declare @myColumn   as nvarchar(128)
set @myColumn = 'myColumn'
if not exists (
    select  1
    from    information_schema.columns columns 
    where   columns.table_catalog   = 'myDatabase'
        and columns.table_schema    = 'mySchema' 
        and columns.table_name      = 'myTable' 
        and columns.column_name     = @myColumn
    )
begin
    exec('alter table myDatabase.mySchema.myTable add'
    +'    ['+@myColumn+'] bigint       null')
end

22
2018-03-20 22:27