web-dev-qa-db-fra.com

Ajouter une colonne à une table, si elle n'existe pas déjà

Je veux écrire une requête pour MS SQL Server qui ajoute une colonne dans une table. Mais je ne veux pas d’affichage d’erreur lorsque je lance/exécute la requête suivante.

J'utilise ce type de requête pour ajouter une table ...

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

Mais je ne sais pas comment écrire cette requête pour une colonne.

142
Tavousi

Vous pouvez utiliser une construction similaire en utilisant la table sys.columns io sys.objects.

IF NOT EXISTS (
  SELECT * 
  FROM   sys.columns 
  WHERE  object_id = OBJECT_ID(N'[dbo].[Person]') 
         AND name = 'ColumnName'
)
171
Lieven Keersmaekers
IF COL_LENGTH('table_name', 'column_name') IS NULL
BEGIN
    ALTER TABLE table_name
    ADD [column_name] INT
END
60
SPL

Une autre alternative. Je préfère cette approche parce que c'est moins écrit mais les deux accomplissent la même chose.

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

J'ai également remarqué que le vôtre cherche où la table existe qui est évidemment juste cette 

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

/ * VERIFIER L'EXISTENCE DE LA COLONNE DANS LA TABLE * /

 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
5
SSJGSS

Voici une autre variante qui a fonctionné pour moi.

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

MODIFIER: Notez que les vues INFORMATION_SCHEMA peuvent ne pas toujours être mises à jour, utilisez plutôt SYS.COLUMNS:

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

1
Adil H. Raza
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
0
Code First