테이블에 열이 없으면 추가하십시오.


188

테이블에 열을 추가하는 MS SQL Server에 대한 쿼리를 작성하고 싶습니다. 그러나 다음 쿼리를 실행 / 실행할 때 오류 표시를 원하지 않습니다.

이 종류의 쿼리를 사용하여 테이블을 추가하고 있습니다 ...

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

그러나 열에 대한이 쿼리를 작성하는 방법을 모르겠습니다.



sys.tables"일반"대신 사용해야 sys.objects합니다. 유형을 명시 적으로 지정할 필요는 없습니다 ( sys.tables이미 명확합니다 ....)
marc_s

COL_LENGTH Alternative은 SQL-Server 2008에서만 작동하지만 작동합니다.
Paul-Henri

답변:


219

sys.columnsio 테이블을 사용하여 유사한 구성을 사용할 수 있습니다 sys.objects.

IF NOT EXISTS (
  SELECT * 
  FROM   sys.columns 
  WHERE  object_id = OBJECT_ID(N'[dbo].[Person]') 
         AND name = 'ColumnName'
)

42
이 경우 실제 코드에 IF NOT EXISTS를 사용하려고합니다.
Nat

2
최적화 된 쿼리를 위해 select 문과 함께 최상위 1을 사용할 수 있습니다
Banketeshvar Narayan

11
@BanketeshvarNarayan 이것은 잘못되었습니다. EXISTS절의 하위 쿼리에 대한 실행 계획 은 동일합니다. 같은 것들 SELECT 1또는 SELECT TOP 1불필요하다. 이 EXISTS절 자체는 쿼리 최적화 프로그램이 EXISTS적어도 SQL Server에서 ... 를 평가하는 데 필요한 최소 읽기만 수행하도록 지시합니다 . 다른 DB 엔진에는 다소 효율적인 쿼리 최적화 프로그램이있을 수 있습니다.
케네스 코크란

9
@BanketeshvarNarayan ADD Column쿼리를 최적화하는 경우 ... 너무 자주 실행해야합니다!
Fenton

1
@ user391339-OP가 게시 한 것과 유사한 구문을 게시했지만 예, 열 존재 하지 않는 경우 조치를 취하려면 IF NOT EXISTS입니다. 나는 이것에 대한 답을 편집 할 필요가 없다고 생각하지만 개선 된 것으로 생각되면 자유롭게 편집하십시오.
Lieven Keersmaekers

91
IF COL_LENGTH('table_name', 'column_name') IS NULL
BEGIN
    ALTER TABLE table_name
    ADD [column_name] INT
END

1
이 작업을 시도했지만 COL_LENGTH 함수가 존재하지 않는다는 오류를 반환합니다.
ThEpRoGrAmMiNgNoOb


6
작은 추가-열 이름에 대괄호를 사용하면 안됩니다 . COL_LENGTH('table_name', '[column_name]')SQL Server 2016에서 항상 null을 반환하기 때문입니다 ( COL_LENGTH('[table_name]', 'column_name') works as expected).
stop-cran

33

다른 대안. 나는 쓰기가 적기 때문에이 접근법을 선호하지만 두 가지가 같은 것을 성취합니다.

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

나는 또한 당신이 테이블이 존재하는 곳을 찾고 있다는 것을 분명히 알았습니다.

 if COLUMNPROPERTY( OBJECT_ID('dbo.Person'),'ColumnName','ColumnId') is not null

2
나는 그것을 좋아한다. 여기에 게시하는 데 가장 좋은 부분은 이와 같은 보석을 찾는 것입니다.
JStead

2
'ColumnId'란 무엇입니까?
Marius Stănescu

'ColumnId'는 확인중인 열 속성의 이름입니다. 이름 등과 같이 열에 존재하는 속성 이름을 사용했을 수 있습니다.
Jacques Bosch

5

나를 위해 일한 또 다른 변형이 있습니다.

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

편집 : INFORMATION_SCHEMA보기가 항상 업데이트되는 것은 아닙니다 SYS.COLUMNS. 대신 사용하십시오.

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


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

이것이 도움이되기를 바랍니다. 더 많은 정보


이것은 SqlServer 2000에서 나에게 도움이되었지만 받아 들인 대답은 그렇지 않았습니다. sys. * 뷰는 SqlServer 2005 주위에 추가 된 것으로 보입니다 (cf. docs.microsoft.com/ko-kr/sql/relational-databases/…
ZeRemz

0

다른 데이터베이스에서 열을 확인할 때 간단히 데이터베이스 이름을 포함시킬 수 있습니다.

IF NOT EXISTS (
  SELECT * 
  FROM   DatabaseName.sys.columns 
  WHERE  object_id = OBJECT_ID(N'[DatabaseName].[dbo].[TableName]') 
         AND name = 'ColumnName'
)

-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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.