2038

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

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

SQL Server データベースのテーブルに列が存在するかどうかを確認するにはどうすればよいですか?

4

32 に答える 32

2245

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

マーティン・スミスのバージョンはもっと短い:

IF COL_LENGTH('schemaName.tableName', 'columnName') IS NOT NULL
BEGIN
    -- Column Exists
END
于 2008-09-25T12:39:21.297 に答える
1082

より簡潔なバージョン

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、有効な分離レベルに関係なく、コミットされた変更に関するデータのみを常に返すことです。

于 2011-03-20T14:47:50.917 に答える
165

特定の要件に合わせて以下を微調整します。

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

于 2008-09-25T12:35:54.987 に答える
83

これを試して...

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
于 2008-09-25T12:35:28.920 に答える
64

ドロップする前に列の存在を確認している人向け。

SQL Server 2016から、大きなIFラッパーの代わりに新しい DIE ステートメントを使用できます

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
于 2016-05-01T04:46:00.187 に答える
43

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

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

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

于 2008-09-25T12:38:35.777 に答える
36

次のようなものを試してください:

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 については不明ですが、理由がわかりません。

于 2008-09-25T12:38:39.487 に答える
34

最初にtable/ column( id/ 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
于 2008-09-25T12:37:59.270 に答える
28

私の良き友人であり同僚がIF、SQL 関数OBJECT_IDCOLUMNPROPERTYSQL 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
于 2013-03-20T22:27:38.757 に答える
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
于 2011-03-03T15:49:31.893 に答える
22

これを試して

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') 
于 2011-09-30T13:08:56.320 に答える
19

SQL SERVER 2000 でも同様のことが必要でした。@Mitch が指摘しているように、これは 2005 以降でのみ機能します。

それが他の誰かを助けるなら、これは最終的に私のために働いたものです:

if exists (
    select * 
    from 
        sysobjects, syscolumns 
    where 
        sysobjects.id = syscolumns.id 
        and sysobjects.name = 'table' 
        and syscolumns.name = 'column')
于 2012-05-04T14:14:59.630 に答える
11

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

if (exists(select 1 
             from tempdb.sys.columns  
            where Name = 'columnName'
              and Object_ID = object_id('tempdb..#tableName')))
begin
...
end
于 2015-01-07T23:56:25.060 に答える
9

列が存在しない場合は何かをしてください:

BEGIN
    IF (COL_LENGTH('[dbo].[Table]', 'Column ') IS NULL)
    BEGIN
        //Do something
    END
END;

列が存在する場合は何かをします:

BEGIN
    IF (COL_LENGTH('[dbo].[Table]', 'Column ') IS NOT NULL)
    BEGIN
        //Do something
    END
END;
于 2019-11-01T11:53:11.197 に答える
8

小麦の答えは良いですが、スキーマまたはデータベースに同一のテーブル名/列名のペアがないことを前提としています。その状態で安全にするには、これを使用します...

select *
from Information_Schema.Columns
where Table_Catalog = 'DatabaseName'
  and Table_Schema = 'SchemaName'
  and Table_Name = 'TableName'
  and Column_Name = 'ColumnName'
于 2015-03-26T17:42:36.757 に答える
8

列の存在を確認するには、いくつかの方法があります。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'
         ) 
于 2016-02-15T20:45:22.163 に答える
7

データベースへの列の追加を管理するために使用する簡単なスクリプトを次に示します。

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

この例では、NameColumnName追加する で、Object_IdTableName

于 2016-11-16T12:21:08.690 に答える
4

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

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
于 2018-10-30T14:31:52.030 に答える