특정 열이 없으면 추가해야합니다. 다음과 같은 것이 있지만 항상 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.COLUMNS
Microsoft는 버전간에 시스템 테이블을 보존 할 것을 보장하지 않기 때문에 시스템 테이블을 선호합니다 . 예를 들어, dbo.syscolumns
SQL 2008에서도 여전히 작동하지만 더 이상 사용되지 않으며 나중에 언제든지 제거 할 수 있습니다.
답변
정보 스키마 시스템보기를 사용하여 관심있는 테이블에 대해 거의 모든 것을 찾을 수 있습니다.
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'yourTableName'
ORDER BY ORDINAL_POSITION
Information_schema 뷰를 사용하여 뷰, 저장 프로 시저 및 데이터베이스에 대한 거의 모든 것을 조사 할 수도 있습니다.
