列がまだ存在しない場合は、テーブルに追加します


187

テーブルに列を追加するMS SQL Serverのクエリを記述したいと思います。しかし、次のクエリを実行/実行すると、エラーが表示されたくありません。

この種類のクエリを使用してテーブルを追加しています...

IF EXISTS (
       SELECT *
       FROM   sys.objects
       WHERE  OBJECT_ID = OBJECT_ID(N'[dbo].[Person]')
              AND TYPE IN (N'U')
   )

しかし、このクエリを列に書き込む方法がわかりません。



sys.tables"generic"の代わりに使用する必要sys.objectsがあります。タイプを明示的に指定する必要はありません(これはsys.tablesすでにわかります...)
marc_s

COL_LENGTH代替はSQL-Server 2008からのみ機能しますが、機能します。
Paul-Henri

回答:


218

sys.columnsテーブルio を使用して、同様の構成を使用できますsys.objects

IF NOT EXISTS (
  SELECT * 
  FROM   sys.columns 
  WHERE  object_id = OBJECT_ID(N'[dbo].[Person]') 
         AND name = 'ColumnName'
)

42
この場合、実際のコードでIF NOT EXISTSを使用することに注意してください。
Nat 2013

2
最適化されたクエリでは、selectステートメントでtop 1を使用できます
Banketeshvar Narayan

11
@BanketeshvarNarayanこれは間違いです。EXISTS句内のサブクエリの実行プランは同じです。以下のようなものSELECT 1かはSELECT TOP 1不要です。EXISTS句自体は最小限に評価する必要が読み込み実行するためにクエリオプティマイザに指示しますEXISTS少なくともSQL Serverで...。他のDBエンジンは、多かれ少なかれ効率的なクエリオプティマイザーを備えている場合があります。
ケネスコクラン

9
@BanketeshvarNarayan ADD Columnクエリを最適化している場合...頻繁に実行している必要があります。
フェントン

1
@ user391339-OPと同様の構成を投稿しましたが、列存在しない場合にアクションを実行したい場合、ステートメントはIF NOT EXISTSになります。私はこれに対する答えを編集する必要性を本当に感じていませんが、それが改善だと思ったら自由に編集してください。
Lieven Keersmaekers、2018

91
IF COL_LENGTH('table_name', 'column_name') IS NULL
BEGIN
    ALTER TABLE table_name
    ADD [column_name] INT
END

1
これを試してみましたが、COL_LENGTH関数が存在しないというエラーが返されます。
ThEpRoGrAmMiNgNoOb 2015年

3
SQL Server 2008以降が必要
Robert Brown

6
小さな追加COL_LENGTH('table_name', '[column_name]')-SQL Server 2016(COL_LENGTH('[table_name]', 'column_name') works as expected)では常にnullを返すため、列名に角かっこを使用しないでください。
stop-cran 2017

33

別の選択肢。私はこのアプローチを好んでいます。なぜなら書くことは少ないですが、2つは同じことを達成するからです。

IF COLUMNPROPERTY(OBJECT_ID('dbo.Person'), 'ColumnName', 'ColumnId') IS NULL
BEGIN
    ALTER TABLE Person 
    ADD ColumnName VARCHAR(MAX) NOT NULL
END

私はまた、あなたのテーブルが明らかにこれだけであるテーブルが存在する場所を探していることに気づきました

 if COLUMNPROPERTY( OBJECT_ID('dbo.Person'),'ColumnName','ColumnId') is not null

2
私はそれが好きです。ここに投稿することの最も良い点は、このような宝石を見つけることです。
JStead

2
「ColumnId」とは何ですか?
MariusStănescu19年

'ColumnId'は、チェック対象の列プロパティの名前です。おそらく、等の名前などの列、上に存在する任意のプロパティ名を使用することもできました
ジャック・ボッシュ

5

ここに私のために働いた別のバリエーションがあります。

IF NOT EXISTS (SELECT 1
        FROM INFORMATION_SCHEMA.COLUMNS
        WHERE upper(TABLE_NAME) = 'TABLENAME'
        AND upper(COLUMN_NAME) = 'COLUMNNAME')
BEGIN
    ALTER TABLE [dbo].[Person] ADD Column
END
GO

編集:INFORMATION_SCHEMAビューは常に更新されるとは限らないことに注意してください、SYS.COLUMNS代わりに使用してください:

IF NOT EXISTS (SELECT 1 FROM SYS.COLUMNS....


0
IF NOT EXISTS (SELECT * FROM syscolumns
  WHERE ID=OBJECT_ID('[db].[Employee]') AND NAME='EmpName')
  ALTER TABLE [db].[Employee]
  ADD [EmpName] VARCHAR(10)
GO

これがお役に立てば幸いです。より詳しい情報


これは私にとってSqlServer 2000では機能しましたが、受け入れられた答えは機能しませんでした。sys。*ビューは、SqlServer 2005の前後のどこかに追加されたようです。docs.microsoft.com/en-us/sql/relational-databases/...
ZeRemz

0

別のデータベースの列を確認するときは、データベース名を含めるだけです。

IF NOT EXISTS (
  SELECT * 
  FROM   DatabaseName.sys.columns 
  WHERE  object_id = OBJECT_ID(N'[DatabaseName].[dbo].[TableName]') 
         AND name = 'ColumnName'
)

-1
IF NOT EXISTS (SELECT 1  FROM SYS.COLUMNS WHERE  
OBJECT_ID = OBJECT_ID(N'[dbo].[Person]') AND name = 'DateOfBirth')
BEGIN
ALTER TABLE [dbo].[Person] ADD DateOfBirth DATETIME
END
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.