sql-server - engine - t-sql 이란




SQL Server 테이블에 열이 있는지 확인하는 방법? (16)

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

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

SQL Server 데이터베이스의 테이블에 열이 있는지 확인하려면 어떻게합니까?


@Mitch가 지적한 바와 같이 SQL Server 2000과 비슷하게 필요한 것은 inm 2005+에서만 가능합니다.

다른 사람에게 도움이된다면, 결국 나를 위해 일한 것입니다.

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

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


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

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

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

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

다음과 같이 시도해보십시오.

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 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_IdTableName


먼저 dbo.syscolumns (필드 정의를 포함하는 내부 SQL Server 테이블)에 table / column ( id / name ) 조합이 있는지 확인하고 추가 ALTER TABLE 쿼리를 실행하지 않은 경우 추가하십시오. 예 :

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

보다 간결한 버전

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 의 첫 x 째 매개 변수 테이블 이름은 필요에 따라 하나, 둘 또는 세 개의 파트 이름 형식이 될 수 있습니다.

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

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

메타 데이터보기를 사용하는 것과 비교하면이 대답의 한 가지 차이점은 COL_LENGTH 와 같은 메타 데이터 함수는 항상 영향을 미치는 분리 수준과 관계없이 커밋 된 변경 사항에 대한 데이터 만 반환 COL_LENGTH 입니다.


열의 존재를 확인하는 데는 여러 가지 방법이 있습니다. INFORMATION_SCHEMA.COLUMNS 는 사용자와 통신하기 위해 만들어 INFORMATION_SCHEMA.COLUMNS 사용하는 것이 좋습니다. 다음 표를 고려하십시오.

 sys.objects
 sys.columns

심지어 system catalog. 를 확인하는 데 사용할 수있는 다른 액세스 방법도 있습니다 system catalog.

또한 SELECT * 를 사용할 필요가 없으며 단순히 NULL value 테스트하십시오.

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

이 시도

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 2000에서 저에게 효과적이었습니다.

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

정보 스키마 시스템 뷰를 사용하여 관심있는 테이블에 대해 알 수 있습니다.

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

또한 Information_schema 뷰를 사용하여 뷰, 저장 프로 시저 및 데이터베이스에 관한 모든 정보를 조회 할 수 있습니다.


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

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 (exists(select 1 
             from tempdb.sys.columns  
            where Name = 'columnName'
              and Object_ID = object_id('tempdb..#tableName')))
begin
...
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'
    +'    ['[email protected]+'] bigint       null')
end

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 exists'
  end




sql-server-2016