web-dev-qa-db-ja.com

SQL Serverテーブルに列が存在するかどうかを確認する方法

特定の列が存在しない場合は追加する必要があります。次のようなものがありますが、常にfalseが返されます。

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

SQL Serverデータベースのテーブルに列が存在するかどうかを確認する方法はありますか

1715
Maciej

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
1890
Mitch Wheat

より簡潔なバージョン

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

メタデータビューを使用する場合と比較した場合のこの回答との1つの違いは、COL_LENGTHなどのメタデータ関数は、有効な分離レベルに関係なく、常にコミットされた変更に関するデータのみを返すということです。

918
Martin Smith

具体的な要件に合わせて以下を微調整してください。

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をクエリしていますか。どちらのステートメントでも、テーブル/列名にタイプミスがありますか?

131
Luke Bennett

これを試して...

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
67
Leon Tayson

マイクロソフトはバージョン間でシステムテーブルを保持することを保証していないため、システムテーブルよりもINFORMATION_SCHEMA.COLUMNSをお勧めします。たとえば、dbo.syscolumnsはSQL 2008でも機能しますが、推奨されなくなり、将来いつでも削除される可能性があります。

44

情報スキーマシステムビューを使用して、関心のあるテーブルについてほとんど何でも見つけることができます。

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

Information_schemaビューを使用して、ビュー、ストアドプロシージャ、およびデータベースに関するほとんどすべての情報を取得することもできます。

39
anonymous

最初にtable/columnid/name)の組み合わせがdbo.syscolumns(フィールド定義を含む内部SQL Serverテーブル)に存在するかどうかを確認し、適切でない場合は追加するために適切なALTER TABLEクエリを発行します。例えば:

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

次のようにしてください。

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の両方で動作するはずです。SQLServer 2008についてはよくわかりませんが、その理由はわかりません。

28
Matt Lacey

それをドロップするために列の存在をチェックしている人のために。

SQL Server 2016 大きなIFラッパーの代わりに新しいDIEステートメントを使うことができます

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
27
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
23

友だちの同僚から、SQL Server 2005以降でSQL関数OBJECT_IDおよびIFを含むCOLUMNPROPERTYブロックを使用して列をチェックする方法を教えてください。次のようなものを使うことができます。

ここで自分の目で確かめることができます

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
23

これは私にとってSQL 2000ではうまくいきました:

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

これを試して

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') 
20
Douglas Tondo

私はSQL Server 2000にも同じようなものを必要としていました、そして@Mitchが指摘するように、これは2005年以降にのみ機能します。

それが他の誰かを助けるべきなら、これは結局私のために働いたものです:

if exists (
    select * 
    from 
        sysobjects, syscolumns 
    where 
        sysobjects.id = syscolumns.id 
        and sysobjects.name = 'table' 
        and syscolumns.name = 'column')
17
FrostbiteXIII
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
14
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;
10
Na30m

受け入れられた答え :の一時テーブルバージョン

if (exists(select 1 
             from tempdb.sys.columns  
            where Name = 'columnName'
              and Object_ID = object_id('tempdb..#tableName')))
begin
...
end
9
crokusek
select distinct object_name(sc.id)
from syscolumns sc,sysobjects so  
where sc.name like '%col_name%' and so.type='U'
9
Nishad

列の存在を確認する方法はいくつかあります。 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'
         ) 
5
Ali Elmi

小麦の答えはいいのですが、スキーマやデータベースに同じテーブル名と列名のペアがないと仮定します。その条件のためにそれを安全にするためにこれを使用してください...

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

これは私がデータベース内の列の追加を管理するために使用する簡単なスクリプトです:

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です。

4
UJS

最も単純でわかりやすい解決策の1つは、次のとおりです。

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
4
Arsman Ahmad

以下のクエリを使用して、検索された列がテーブルに存在するかどうかを確認できます。以下に示すように、検索結果に基づいて決定することもできます。

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
2
Suraj Kumar

さらに別のバリエーション...

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

別の貢献は、存在しない場合に列を追加する次のサンプルです。

    USE [Northwind]
    GO

    IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
                    WHERE TABLE_NAME = 'Categories'
                        AND COLUMN_NAME = 'Note')
    BEGIN

    ALTER TABLE Categories ADD Note NVARCHAR(800) NULL

    END
    GO

それが役に立てば幸い。シモーネ

0
Simone Spagna

以下のクエリを実行して、指定したテーブルに列が存在するかどうかを確認します。

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';
0
S Krishna
IF EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_CATALOG = 'Database Name'
and TABLE_SCHEMA = 'Schema Name'
and TABLE_NAME = 'Table Name'
and COLUMN_NAME = 'Column Name'
and DATA_TYPE = 'Column Type') -- Where statement lines can be deleted.

BEGIN
--COLUMN EXISTS IN TABLE
END

ELSE BEGIN
--COLUMN DOES NOT EXISTS IN TABLE
END
0

テーブル - >スクリプトテーブル - >新しいウィンドウ - あなたはデザインスクリプトを持っています。新しいウィンドウで列名を確認

0
arnav
IF EXISTS(SELECT 1 FROM sys.columns 
      WHERE Name = N'columnName'
      AND Object_ID = Object_ID(N'schemaName.tableName'))

これは、この問題のかなり簡単な方法であり、簡単な解決策です。同様のシナリオでこれを複数回使用しました。それは魅力のように機能しますが、それに疑いの余地はありません。

0
Ilangeeran