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

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

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

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



답변

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


답변

더 간결한 버전

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은 실제로 격리 수준에 관계없이 커밋 된 변경에 대한 데이터 만 반환 한다는 메타 데이터 기능 입니다.


답변

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

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를 쿼리하고 있습니까? 두 진술의 표 / 열 이름에 오타가 있습니까?


답변

이 시도…

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


답변

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

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

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name


답변

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


답변

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

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

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