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.
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'
)
IF COL_LENGTH('table_name', 'column_name') IS NULL
BEGIN
ALTER TABLE table_name
ADD [column_name] INT
END
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
/ * 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
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ôtSYS.COLUMNS
:
IF NOT EXISTS (SELECT 1
FROM SYS.COLUMNS....
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