2012-01-15 15 views
113

テーブルにカラムを追加するクエリをMS SQL Serverに書きたいとします。しかし、私は次のクエリを実行/実行するときにエラー表示をしたくありません。私はテーブルを追加するために、クエリのこの種を使用していますテーブルにカラムを追加する(存在しない場合)

...

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

をしかし、私は列に、このクエリを作成する方法を知りません。

+0

[exis列のチェック方法SQL Serverのテーブルのts](http://stackoverflow.com/questions/133031/how-to-check-if-column-exists-in-sql-server-table) –

+0

あなたの代わりに 'sys.tables'を使用する必要があります"generic" 'sys.objects' - 型を明示的に指定する必要はありません(すでに' sys.tables'から明らかです)。 –

+0

COL_LENGTH代替はSQL Server 2008のみで動作しますが、働く –

答えて

132

sys.columnsテーブルio sys.objectsを使用すると、同様の構文を使用できます。

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

この例では、実際のコードでIF NOT EXISTSを使用したいとします。 – Nat

+1

これはMS SQL 2005で動作しますか? – guiomie

+2

最適化されたクエリでは、select文でトップ1を使用できます。 –

28

もう1つの方法です。私はこのアプローチが好きです。なぜなら、それは書き込みが少ないからですが、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 
+9

[またはさらにタイピングのための](http://stackoverflow.com/a/5369176/73226) –

+2

私はそれが好きです。私はここに掲示することについての最も良い部分は、このような宝石を見つけることだと思います。 – JStead

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

私はこの処理を試みましたが、COL_LENGTH関数が存在しないことを示すエラーを返します。 – ThEpRoGrAmMiNgNoOb

+0

SQL Server 2008+が必要です。 – Rob

+0

小規模な追加 - SQL Server 2016では、COL_LENGTH( 'table_name'、 '[column_name]') 'は常にnullを返します(' COL_LENGTH( '[ table_name] '、' column_name ')は期待通りに動作します)。 –

3

/*テーブルの列の存在をチェックする*/

で存在する場所を探している気づきました
IF COL_LENGTH('TABLE_NAME','COLUMN_NAME') IS NULL 
BEGIN 
ALTER TABLE .... /*COLUMN DOES NOT EXIST OR CALLER DOES NOT HAVE PERMISSION TO VIEW THE OBJECT*/ 
END 
0
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 
関連する問題