Jak sprawdzić, czy kolumna istnieje w tabeli SQL Server?

Muszę dodać konkretną kolumnę, jeśli nie istnieje. Mam coś takiego, ale zawsze zwraca false:

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

Jak mogę sprawdzić, czy kolumna istnieje w tabeli bazy danych SQL Server?

Author: Rann Lifshitz, 2008-09-25

23 answers

SQL Server 2005 od:

IF EXISTS(SELECT 1 FROM sys.columns 
          WHERE Name = N'columnName'
          AND Object_ID = Object_ID(N'schemaName.tableName'))
BEGIN
    -- Column Exists
END
Wersja Martina Smitha jest krótsza:
IF COL_LENGTH('schemaName.tableName', 'columnName') IS NOT NULL
BEGIN
    -- Column Exists
END
 1764
Author: Mitch Wheat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-12 03:35:20

Bardziej zwięzła wersja

 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

Punkt dotyczący uprawnień do wyświetlania metadanych dotyczy wszystkich odpowiedzi nie tylko tej.

Zauważ, że pierwsza nazwa tabeli parametrów to COL_LENGTH może być w formacie jednej, dwóch lub trzech części, zgodnie z wymaganiami.

Przykład odnoszący się do tabeli w innej bazie danych to

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

Jedną z różnic w tej odpowiedzi w porównaniu z używaniem widoków metadanych jest to, że funkcje metadanych, takie jak COL_LENGTH zawsze zwracają tylko dane o popełnione zmiany niezależnie od obowiązującego poziomu izolacji.

 865
Author: Martin Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-08 19:40:22

Dostosuj poniższy tekst, aby odpowiadał Twoim wymaganiom:

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 to deal with edit to question: to powinno zadziałać-przyjrzyj się uważnie swojemu kodowi pod kątem głupich błędów; czy zapytujesz INFORMATION_SCHEMA w tej samej bazie danych, do której np. zostanie zastosowana twoja wstawka? Czy masz literówkę w nazwie tabeli/kolumny w którejkolwiek z instrukcji?

 125
Author: Luke Bennett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-31 08:57:33

Spróbuj tego...

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
 65
Author: Leon Tayson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-14 07:18:51

Wolałbym INFORMATION_SCHEMA.COLUMNS niż tabelę systemową, Ponieważ Microsoft nie gwarantuje zachowania tabel systemowych między wersjami. Na przykład, dbo.syscolumns nadal działa w SQL 2008, ale jest przestarzały i może zostać usunięty w dowolnym momencie w przyszłości.

 43
Author: Christian Hayter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-26 08:58:19

Możesz użyć widoku systemu schematów informacyjnych, aby dowiedzieć się praktycznie wszystkiego o interesujących Cię tabelach:

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

Możesz również przesłuchać widoki, procedury przechowywane i prawie wszystko o bazie danych za pomocą widoków Information_schema.

 38
Author: anonymous,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-25 12:38:35

Najpierw sprawdź, czy table/column(id/name) kombinacja istnieje w dbo.syscolumns (wewnętrznej tabeli SQL Server, która zawiera definicje pól), a jeśli nie, wyślij odpowiednie zapytanie ALTER TABLE, aby je dodać. Na przykład:

IF NOT EXISTS ( SELECT  *
            FROM    syscolumns
            WHERE   id = OBJECT_ID('Client')
                    AND name = 'Name' ) 
ALTER TABLE Client
ADD Name VARCHAR(64) NULL
 28
Author: mdb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-15 12:29:34

Spróbuj czegoś takiego:

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

Następnie użyj go w ten sposób:

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

Powinno działać zarówno na SQL Server 2000 jak i SQL Server 2005. Nie jestem pewien co do SQL Server 2008, ale nie widze czemu nie.

 26
Author: Matt Lacey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-15 12:27:43

Dla ludzi, którzy sprawdzają istnienie kolumny, aby ją porzucili.

W SQL Server 2016 możesz używać nowych instrukcji DIE zamiast dużych IF wrapperów

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
 25
Author: Pரதீப்,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-01 04:46:00
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
Author: Tuomo Kämäräinen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-03 15:49:31

Mój dobry przyjaciel i kolega pokazał mi, jak można również użyć bloku IF Z FUNKCJAMI SQL OBJECT_ID i COLUMNPROPERTY w SQL SERVER 2005+, aby sprawdzić kolumnę. Możesz użyć czegoś podobnego do:

Możesz zobaczyć na własne oczy tutaj

IF (OBJECT_ID(N'[dbo].[myTable]') IS NOT NULL AND
    COLUMNPROPERTY( OBJECT_ID(N'[dbo].[myTable]'), 'ThisColumnDoesNotExist', 'ColumnId') IS NULL)
BEGIN
    SELECT 'Column does not exist -- You can add TSQL to add the column here'
END
 21
Author: brazilianldsjaguar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-21 17:27:42

To działało dla mnie w SQL 2000:

IF EXISTS 
(
    SELECT * 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE table_name = 'table_name' 
    AND column_name = 'column_name'
)
BEGIN
...
END
 20
Author: Joe M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-23 19:31:12

Spróbuj tego

SELECT COLUMNS.*
FROM   INFORMATION_SCHEMA.COLUMNS COLUMNS,
       INFORMATION_SCHEMA.TABLES TABLES
WHERE  COLUMNS.TABLE_NAME = TABLES.TABLE_NAME
       AND Upper(COLUMNS.COLUMN_NAME) = Upper('column_name') 
 19
Author: Douglas Tondo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-21 14:35:54

Potrzebowałem podobnego dla SQL SERVER 2000 i, jak wskazuje @Mitch, działa to tylko WM 2005+.

Jeśli to komuś pomoże, to w końcu mi się to udało:

if exists (
    select * 
    from 
        sysobjects, syscolumns 
    where 
        sysobjects.id = syscolumns.id 
        and sysobjects.name = 'table' 
        and syscolumns.name = 'column')
 16
Author: FrostbiteXIII,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-16 07:30:10
if exists (select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='<table_name>' and COLUMN_NAME='<column_name>')
  begin
    print 'Column you have specified exists'
  end
else
  begin
    print 'Column does not exists'
  end
 12
Author: BYRAKUR SURESH BABU,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-29 23:44:47
IF NOT EXISTS( SELECT NULL
            FROM INFORMATION_SCHEMA.COLUMNS
           WHERE table_name = 'tablename'
             AND table_schema = 'db_name'
             AND column_name = 'columnname')  THEN

  ALTER TABLE `TableName` ADD `ColumnName` int(1) NOT NULL default '0';

END IF;
 10
Author: Na30m,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-12 12:47:24
select distinct object_name(sc.id)
from syscolumns sc,sysobjects so  
where sc.name like '%col_name%' and so.type='U'
 9
Author: Nishad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-06 15:27:40

A temp table version of the accepted answer :

if (exists(select 1 
             from tempdb.sys.columns  
            where Name = 'columnName'
              and Object_ID = object_id('tempdb..#tableName')))
begin
...
end
 9
Author: crokusek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:01

ODPOWIEDŹ Wheat ' a jest dobra, ale zakłada, że nie masz żadnych identycznych par nazwa tabeli / nazwa kolumny w żadnym schemacie lub bazie danych. Aby to było bezpieczne dla tego stanu, użyj tego...

select *
from Information_Schema.Columns
where Table_Catalog = 'DatabaseName'
  and Table_Schema = 'SchemaName'
  and Table_Name = 'TableName'
  and Column_Name = 'ColumnName'
 5
Author: Daniel Barbalace,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-26 17:42:36

Jednym z najprostszych i najbardziej zrozumiałych rozwiązań jest:

IF COL_LENGTH('Table_Name','Column_Name') IS NULL
 BEGIN
    -- Column Not Exists, implement your logic
 END 
ELSE
 BEGIN
    -- Column Exists, implement your logic
 END
 4
Author: Arsman Ahmad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-24 07:17:40

Oto prosty skrypt, którego używam do zarządzania dodawaniem kolumn w bazie danych:

IF NOT EXISTS (
        SELECT *
        FROM sys.Columns
        WHERE Name = N'QbId'
            AND Object_Id = Object_Id(N'Driver')
        )
BEGIN
    ALTER TABLE Driver ADD QbId NVARCHAR(20) NULL
END
ELSE
BEGIN
    PRINT 'QbId is already added on Driver'
END

W tym przykładzie Name jest ColumnName do dodania, a Object_Id jest TableName

 4
Author: UJS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-28 04:41:28

Istnieje kilka sposobów sprawdzenia istnienia kolumny. Zdecydowanie polecam użycie INFORMATION_SCHEMA.COLUMNS, ponieważ jest on tworzony w celu komunikacji z użytkownikiem. Rozważmy następujące tabele:

 sys.objects
 sys.columns

A nawet kilka innych metod dostępu dostępnych do sprawdzenia system catalog.

Również, nie trzeba używać SELECT *, po prostu przetestuj go przez NULL value

IF EXISTS(
           SELECT NULL 
           FROM INFORMATION_SCHEMA.COLUMNS
           WHERE
             TABLE_NAME = 'myTableName'
             AND COLUMN_NAME = 'myColumnName'
         ) 
 4
Author: Ali Elmi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-28 14:23:07

Kolejna odmiana...

SELECT Count(*) AS existFlag FROM sys.columns 
WHERE [name] = N'ColumnName' AND [object_id] = OBJECT_ID(N'TableName')
 -1
Author: Manuel Alves,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-10 11:01:43