문제

특정 열이 존재하지 않으면 특정 열을 추가해야합니다. 다음과 같은 것이 있지만 항상 거짓을 반환합니다.

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

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

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

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

information_schema views를 사용하여보기를 심문하고, 저장된 절차 및 데이터베이스에 대한 거의 모든 것을 할 수도 있습니다.

먼저 있는지 확인하십시오 table/column(id/name) 조합이 존재합니다 dbo.syscolumns (필드 정의가 포함 된 내부 SQL 서버 테이블), 적절한 문제를 해결하지 않으면 ALTER TABLE 추가 할 쿼리. 예를 들어:

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

칼럼 존재를 확인하는 사람들에게는 그것을 떨어 뜨리기 위해.

~ 안에 SQL Server 2016 큰 대신 New Die 문을 사용할 수 있습니다 IF 포장지

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

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

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에 대해서는 확실하지 않지만 그 이유는 모르겠습니다.

좋은 친구이자 동료가 당신이 어떻게 사용할 수 있는지 보여주었습니다. IF SQL 기능으로 차단합니다 OBJECT_ID 그리고 COLUMNPROPERTY SQL 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
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

이것은 SQL 2000에서 저에게 효과가있었습니다.

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

이 시도

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

SQL Server 2000에 대해 비슷한 것이 필요했고 @Mitch가 지적했듯이 이것은 INM 2005+ 만 작동합니다.

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

if exists (
    select * 
    from 
        sysobjects, syscolumns 
    where 
        sysobjects.id = syscolumns.id 
        and sysobjects.name = 'table' 
        and syscolumns.name = 'column')
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
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;
select distinct object_name(sc.id)
from syscolumns sc,sysobjects so  
where sc.name like '%col_name%' and so.type='U'

온도 테이블 버전 받아 들여진 답변:

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

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

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

열의 존재를 확인하는 방법에는 여러 가지가 있습니다. 나는 강력히 사용하는 것이 좋습니다 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'
         ) 

가장 간단하고 이해할 수있는 솔루션 중 하나는 다음과 같습니다.

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

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

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 입니다 TableName

아래 쿼리를 사용하여 검색 된 열이 테이블에 있는지 확인할 수 있습니다. 아래 그림과 같이 검색 된 결과를 기반으로 결정을 내릴 수 있습니다.

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

또 다른 변형 ...

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

테이블 -> 스크립트 테이블로 -> 새 Windows- 디자인 스크립트가 있습니다. 새 창에서 열 이름을 확인하고 찾으십시오

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

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';
IF EXISTS(SELECT 1 FROM sys.columns 
      WHERE Name = N'columnName'
      AND Object_ID = Object_ID(N'schemaName.tableName'))

이것은이 문제에 대한 매우 쉬운 방법이자 간단한 솔루션이어야합니다. 비슷한 시나리오에 여러 번 사용했습니다. 그것은 매력처럼 작동합니다.

IF EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Table Name' and COLUMN_NAME = 'Column Name')

BEGIN
--COLUMNS EXISTS IN TABLE
END

ELSE BEGIN
--COLUMNS DOES NOT EXISTS IN TABLE
END
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top