Je veux écrire une requête pour MS SQL Server qui ajoute une colonne dans une table. Mais je ne veux aucun affichage d'erreur lorsque j'exécute / 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.
sql-server
add
not-exists
Tavousi
la source
la source
sys.tables
place du "générique"sys.objects
- alors vous n'avez pas à spécifier le type explicitement (c'est évident dusys.tables
déjà ....)IF NOT EXISTS
clause à laADD COLUMN
syntaxe)Réponses:
Vous pouvez utiliser une construction similaire en utilisant la
sys.columns
table iosys.objects
.IF NOT EXISTS ( SELECT * FROM sys.columns WHERE object_id = OBJECT_ID(N'[dbo].[Person]') AND name = 'ColumnName' )
la source
EXISTS
clause sont identiques. Des choses commeSELECT 1
ouSELECT TOP 1
sont inutiles. LaEXISTS
clause elle-même indique à l'optimiseur de requêtes de n'effectuer que les lectures minimales nécessaires pour évaluer leEXISTS
... au moins dans SQL Server. D'autres moteurs de base de données peuvent avoir un optimiseur de requêtes plus ou moins efficace.ADD Column
requêtes ... vous devez les exécuter trop souvent!IF COL_LENGTH('table_name', 'column_name') IS NULL BEGIN ALTER TABLE table_name ADD [column_name] INT END
la source
COL_LENGTH('table_name', '[column_name]')
il renvoie toujours null dans SQL Server 2016 (COL_LENGTH('[table_name]', 'column_name') works as expected
).Une autre alternative. Je préfère cette approche car elle est moins écrite 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 cherchait où la table existe qui est évidemment juste ceci
la source
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
IF NOT EXISTS (SELECT 1 FROM SYS.COLUMNS....
la source
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
la source
IF NOT EXISTS (SELECT * FROM syscolumns WHERE ID=OBJECT_ID('[db].[Employee]') AND NAME='EmpName') ALTER TABLE [db].[Employee] ADD [EmpName] VARCHAR(10) GO
J'espère que cela aiderait. Plus d'informations
la source
Lors de la recherche d'une colonne dans une autre base de données, vous pouvez simplement inclure le nom de la base de données:
IF NOT EXISTS ( SELECT * FROM DatabaseName.sys.columns WHERE object_id = OBJECT_ID(N'[DatabaseName].[dbo].[TableName]') AND name = 'ColumnName' )
la source