SQL Server 테이블에 열이 있는지 확인하는 방법은 무엇입니까?


1853

특정 열이 없으면 추가해야합니다. 다음과 같은 것이 있지만 항상 false를 반환합니다.

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

SQL Server 데이터베이스의 테이블에 열이 존재하는지 어떻게 확인할 수 있습니까?


12
실제로 질문의 코드에 문제가 있다고 생각하지 않습니다. 2008 R2에서 잘 작동합니다. (아마도 잘못된 데이터베이스에서 실행 했습니까? 어쩌면 데이터베이스가 대소 문자를 구분했으며 myTableName / myColumnName 문자열에 사례가 없었습니까?이 유형의 쿼리는 COL_LENGTH 솔루션보다 유연합니다. "INFORMATION_SCHEMA"접두어를 붙여서 다른 데이터베이스와 데이터베이스 링크를 통해 실행하려면 COL_LENGTH 메타 데이터 기능을 사용하여이를 수행하는 방법을 알 수 없습니다.
mwardm

3
@ mwardm- COL_LENGTH('AdventureWorks2012.HumanResources.Department ','ModifiedDate')잘 작동합니다.
Martin Smith

6
작은 관련 힌트 : 열을 추가 한 직후 열을 업데이트하려면 (많은 사용자 가이 목적 으로이 기사를 검색했다고 생각합니다), 양식 문과 EXEC sp_executesql함께 사용할 수 있습니다 UPDATE.
cassandrad

실제 답변은 확인하려는 데이터베이스를 추가해야한다는 것입니다.FROM [YourDatabase].INFORMATION_SCHEMA.COLUMNS
Alex Kwitny

답변:


2054

SQL Server 2005 이후 :

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

Martin Smith의 버전이 더 짧습니다.

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

Martin Smith 버전에서 언급 할 사항 중 하나는 대괄호 [] 안에 columnName을 포함하지 않는 것입니다. columnName이 대괄호 [] 안에 있으면 열이 테이블에 존재하더라도 널을 제공합니다.
Hemendra

@HemendraSinghChauhan-이름의 일부가 아니기 때문입니다. 또한 다음과 같은 이름으로 비교할 때sys.columns
Martin Smith

@MartinSmith는 당신의 대답을 사용하고 있었고 이것을 발견했습니다. 일반적으로 열을 추가하는 동안 대괄호를 사용하므로 COL_LENGTH 함수에서도 사용했습니다. 내 코드는 다음과 같습니다 :Alter table Table_Name Add [ColumnName] NVarchar(max) NULL; Select COL_LENGTH('[TABLE_NAME]', '[COLUMN_NAME]')
Hemendra

예, 유효하지 않습니다. 인수를 COL_LENGTH인용 부호로 묶어야합니다. 이론적으로 누군가가 실제로 이름을 가진 열을 만들 수 있습니다. [COLUMN_NAME]예를 들어 CREATE TABLE #T([[COLUMN_NAME]]] INT); SELECT * FROM #T, 이것이 규칙이 아니면 모호 할 것입니다.
Martin Smith

987

더 간결한 버전

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

메타 데이터보기 권한에 대한 요점은이 답변뿐만 아니라 모든 답변에 적용됩니다.

첫 번째 매개 변수 테이블 이름 COL_LENGTH은 필요에 따라 1, 2 또는 3 개의 부품 이름 형식 일 수 있습니다.

다른 데이터베이스에서 테이블을 참조하는 예는 다음과 같습니다.

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

메타 데이터보기를 사용하는 것과 비교하여이 답변의 한 가지 차이점 COL_LENGTH은 실제로 격리 수준에 관계없이 커밋 된 변경에 대한 데이터 만 반환 한다는 메타 데이터 기능 입니다.


11
이것은 다른 답변보다 읽기 쉽지 않으며 아마도 등급이 높지 않은 이유 일 수 있습니다.
Bill Yang

38
@Bill-어떤 방식으로 읽기 어렵습니까? Firefox에서 잘 보입니다. 이 답변은 승인 된 것보다 2 년 후에 게시되었으며 등급 IMO를 설명합니다. 존재 확인이 명확하지 않은 경우이 유형의 관용구는 SQL Server에서 매우 일반적입니다. 예를 들어 IF OBJECT_ID('TableName','U') IS NULL객체 존재 여부 DB_ID('foo')확인 또는 데이터베이스 존재 여부 확인
Martin Smith

59
@MartinSmith 나는 당신이이 관용구를 알지 못하고 다른 사람으로부터이 코드를 물려받은 경우, 그 코드가하는 일을 즉시 이해하지 못할 것이기 때문에 읽기가 쉽지 않다고 확신합니다. C ++ x>>2대신 쓰는 것과 비슷 x/4합니다. 더 자세한 코드 ( if exists (select column_name from information_schema ...))는 더 많은 공간을 차지하지만 아무도 자신이하는 일을 알아 내기 위해 머리를 긁지 않을 것입니다.
Kip

22
더 간결한 것 외에도 이것은 더 빠른 해결책입니다. 캐시 된 데이터베이스 메타 데이터 를 사용 하는 동안 디스크에 액세스 INFORMATION_SCHEMA하거나 뷰에 액세스 합니다 . sys.columnsCOL_LENGTH
wqw 2019 년

7
이것은 아마도 다른 답변 후 2.5 년 후에 주어 졌기 때문에 아마도 가장 높은 등급의 답변이 아닙니다. 그래서 두 답변의 등급을 비교할 때 항상 날짜를 확인합니다. 훨씬 일찍 주어진 답을 극복하는 데 시간이 오래 걸립니다. ;)
Sean

149

특정 요구 사항에 맞게 아래를 조정하십시오.

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

질문에 대한 편집을 처리하기 위해 편집 : 작동해야합니다-어리석은 실수가 있는지 코드를주의 깊게 살펴보십시오. 예를 들어 삽입이 적용되는 동일한 데이터베이스에서 INFORMATION_SCHEMA를 쿼리하고 있습니까? 두 진술의 표 / 열 이름에 오타가 있습니까?


3
where 절 이후에 TABLE_SCHEMA = 'mySchema'를 추가하면 문제가 해결된다는 것을 알았습니다.
Maciej

12
-1 : OP의 질문에 대답하지 않고 OP에 대해 전혀 묻지 않더라도 OP가 새 콜럼을 추가하는 방법에 대한 새로운 정보 만 추가하며 OP의 의견을 다루지 않습니다.
ANeves

1
+1 OP가 다음에 진행할 추가 정보의 보너스로 OP의 질문에 완벽하게 응답합니다. 그리고 이것은 내가 찾던 것입니다.
Bitterblue

74

이 시도...

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

6
이 방법은 SQL CE에서도 작동하지만 언급 된 다른 방법 중 일부는 그렇지 않습니다.
스왈 터스-복원 모니카

9
;) SELECT 1대신 사용할 수 있습니다 SELECT TOP 1 1.
shA.t

4
EXISTS명령문 내에서 SQL은 열을 자동으로 최적화 count(*)하므로 (과 같이 ) SELECT *충분합니다.
Marc L.

완전성 and [TABLE_SCHEMA] = '???'을 위해 WHERE 절을 추가 하는 것을 고려해야 합니다.
Andrew Jens

50

열 존재를 확인하는 사람들은 열을 삭제합니다.

SQL Server 2016 부터 큰 IF래퍼 대신 새로운 DIE 문을 사용할 수 있습니다

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

47

INFORMATION_SCHEMA.COLUMNSMicrosoft는 버전간에 시스템 테이블을 보존 할 것을 보장하지 않기 때문에 시스템 테이블을 선호합니다 . 예를 들어, dbo.syscolumnsSQL 2008에서도 여전히 작동하지만 더 이상 사용되지 않으며 나중에 언제든지 제거 할 수 있습니다.



5
INFORMATION_SCHEMA뷰에는 ANSI 표준 메타 데이터 만 포함되어 있기 때문에 말할 필요도 없습니다 . 그러나 그것은 존재 테스트에 충분합니다.
Christian Hayter

3
Microsoft는 "SQL Server의 향후 릴리스에서 Microsoft는 열 목록의 끝에 열을 추가하여 시스템 카탈로그 뷰의 정의를 보강 할 수 있습니다. 프로덕션 코드에서 SELECT * FROM sys.catalog_view_name 구문은 반환 된 열이 응용 프로그램을 변경하고 중단시킬 수 있습니다. " 즉, 열을 제거하거나 순서를 변경하지 않습니다. 그것은 에지를 제외한 모든 경우에 대해 충분한 이전 버전과의 호환성입니다.
siride

42

정보 스키마 시스템보기를 사용하여 관심있는 테이블에 대해 거의 모든 것을 찾을 수 있습니다.

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

Information_schema 뷰를 사용하여 뷰, 저장 프로 시저 및 데이터베이스에 대한 거의 모든 것을 조사 할 수도 있습니다.


이것은 설문지가 사용하는 것과 정확히 일치하므로 열이 존재하지 않는 경우 열을 추가하는 방법을 알아야했습니다.
Birel

35

다음과 같은 것을 시도하십시오 :

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

그런 다음 다음과 같이 사용하십시오.

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

SQL Server 2000과 SQL Server 2005 모두에서 작동해야합니다. SQL Server 2008에 대해서는 확실하지 않지만 그 이유를 모릅니다.


34

먼저 table/ column( id/ name) 조합 dbo.syscolumns(필드 정의가 포함 된 내부 SQL Server 테이블 )에 존재 하는지 확인 ALTER TABLE하고 추가 하지 않을 적절한 쿼리를 발행하십시오 . 예를 들면 다음과 같습니다.

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

28

친한 친구이자 동료 IF가 SQL 함수 OBJECT_IDCOLUMNPROPERTYSQL SERVER 2005+에서 블록을 사용하여 열을 확인 하는 방법을 보여주었습니다 . 다음과 유사한 것을 사용할 수 있습니다.

여기서 직접 볼 수 있습니다

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

1
물론 테이블이 존재한다고 확신하는 경우 조건의 첫 부분을 생략하고 확인할 COLUMNPROPERTY수 있습니다.
Ruud Helderman

26
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

이것은 SQL 2000에서 나를 위해 일했습니다.

IF EXISTS 
(
    SELECT * 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE table_name = 'table_name' 
    AND column_name = 'column_name'
)
BEGIN
...
END

21

이 시도

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') 

필요 INFORMATION_SCHEMA.TABLES하지 않고 특정 테이블에 대한 열을 필터링하지 않으므로 때로는 별도의 테이블에 동일한 열 이름에 대해 둘 이상의 행을 반환합니다.
shA.t

19

SQL Server 2000과 비슷한 것이 필요했고 @Mitch가 지적했듯이 2005 년에만 작동합니다.

다른 사람을 도울 수 있다면 이것이 결국 나를 위해 일한 것입니다.

if exists (
    select * 
    from 
        sysobjects, syscolumns 
    where 
        sysobjects.id = syscolumns.id 
        and sysobjects.name = 'table' 
        and syscolumns.name = 'column')

15
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 exist'
end

13
IF NOT EXISTS( SELECT NULL
            FROM INFORMATION_SCHEMA.COLUMNS
           WHERE table_name = 'TableName'
             AND table_schema = 'SchemaName'
             AND column_name = 'ColumnName')  BEGIN

  ALTER TABLE [SchemaName].[TableName] ADD [ColumnName] int(1) NOT NULL default '0';

END;

2
나는 당신이 table_schema = 'schema_name'을 의미한다고 생각합니다.
Tab Alleman

11

허용 된 답변 의 임시 테이블 버전 :

if (exists(select 1 
             from tempdb.sys.columns  
            where Name = 'columnName'
              and Object_ID = object_id('tempdb..#tableName')))
begin
...
end

1
받아 들여지는 대답과 어떻게 다릅니 까? 허용 된 답변에서 임시 테이블이 작동하지 않습니까?
John Saunders

1
옳은. 'sys.columns'를 'tempdb.sys.columns'로 지정하고 테이블 이름 앞에 'tempdb ..'가 있어야하므로 임시 테이블에는 허용되는 답변이 작동하지 않습니다.
crokusek

10
select distinct object_name(sc.id)
from syscolumns sc,sysobjects so  
where sc.name like '%col_name%' and so.type='U'

8

밀의 대답은 좋지만 스키마 또는 데이터베이스에 동일한 테이블 이름 / 열 이름 쌍이 없다고 가정합니다. 그 상태를 안전하게 지키려면 이것을 사용하십시오 ...

select *
from Information_Schema.Columns
where Table_Catalog = 'DatabaseName'
  and Table_Schema = 'SchemaName'
  and Table_Name = 'TableName'
  and Column_Name = 'ColumnName'

8

열이 있는지 확인하는 방법에는 여러 가지가 있습니다. INFORMATION_SCHEMA.COLUMNS사용자와 의사 소통하기 위해 만들어진 그대로 사용하는 것이 좋습니다 . 다음 테이블을 고려하십시오.

 sys.objects
 sys.columns

확인이 가능한 다른 액세스 방법도 있습니다 system catalog.

또한 사용할 필요가 없습니다 SELECT *. 간단히 테스트하십시오.NULL value

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

1
아무리 심지어 경우 SELECT *EXISTS사용되는 존재 때 정말 존재에 대한 모든 행과 모든 열, 내부적으로 만 검사를 선택하지 모든 행과 열을위한 실제로 검사 않기 때문에,
Pawan Nogariya

7

가장 간단하고 이해하기 쉬운 솔루션 중 하나는 다음과 같습니다.

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

7

다음은 데이터베이스에서 열 추가를 관리하는 데 사용하는 간단한 스크립트입니다.

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

이 예에서,은 Name(가) 인 ColumnName추가되어야하고 Object_Id는 ISTableName


4

아래 쿼리는 검색된 열이 테이블에 있는지 여부를 확인하는 데 사용할 수 있습니다. 검색된 결과에 따라 아래와 같이 결정을 내릴 수도 있습니다.

IF EXISTS (SELECT 'Y' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = <YourTableName> AND COLUMN_NAME = <YourColumnName>)
  BEGIN
    SELECT 'Column Already Exists.'
  END
  ELSE
  BEGIN
    ALTER TABLE <YourTableName> ADD <YourColumnName> <DataType>[Size]
  END

3

또 다른 변형 ...

SELECT 
  Count(*) AS existFlag 
FROM 
  sys.columns 
WHERE 
  [name] = N 'ColumnName' 
  AND [object_id] = OBJECT_ID(N 'TableName')

1

table-> script table as-> new windows-디자인 스크립트가 있습니다. 새 창에서 열 이름 확인 및 찾기


1

주어진 테이블에 열이 존재하는지 확인하려면 아래 쿼리를 실행하십시오.

IF(SELECT COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'TableName' AND COLUMN_NAME = 'ColumnName') IS NOT NULL
PRINT 'Column Exists in the given table';

1

존재하지 않는 경우 열을 추가하는 다음 샘플이 또 다른 컨트 리뷰 션입니다.

    USE [Northwind]
    GO

    IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
                    WHERE TABLE_NAME = 'Categories'
                        AND COLUMN_NAME = 'Note')
    BEGIN

    ALTER TABLE Categories ADD Note NVARCHAR(800) NULL

    END
    GO

도움이 되길 바랍니다. 시몬


0
IF EXISTS(SELECT 1 FROM sys.columns 
      WHERE Name = N'columnName'
      AND Object_ID = Object_ID(N'schemaName.tableName'))

이것은이 문제에 대한 상당히 쉬운 방법이며 간단한 해결책이어야합니다. 비슷한 시나리오에 여러 번 사용했습니다. 그것은 매력처럼 작동합니다.


0
IF EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_CATALOG = 'Database Name'
and TABLE_SCHEMA = 'Schema Name'
and TABLE_NAME = 'Table Name'
and COLUMN_NAME = 'Column Name'
and DATA_TYPE = 'Column Type') -- Where statement lines can be deleted.

BEGIN
--COLUMN EXISTS IN TABLE
END

ELSE BEGIN
--COLUMN DOES NOT EXISTS IN TABLE
END

0

열이 존재하지 않는 경우 무언가를 수행하십시오.

BEGIN
    IF (COL_LENGTH('[dbo].[Table]', 'Column ') IS NULL)
    BEGIN
        //Do something
    END
END;

열이 존재하는 경우 무언가를 수행하십시오.

BEGIN
    IF (COL_LENGTH('[dbo].[Table]', 'Column ') IS NOT NULL)
    BEGIN
        //Do something
    END
END;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.