Comment vérifier si une colonne existe dans une table SQL Server?
-
02-07-2019 - |
Question
Je dois ajouter une colonne spécifique si elle n'existe pas. J'ai quelque chose comme ce qui suit, mais il retourne toujours faux:
IF EXISTS(SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'myTableName'
AND COLUMN_NAME = 'myColumnName')
Comment puis-je vérifier si une colonne existe dans une table de la base de données SQL Server?
La solution
SQL Server 2005 et ultérieur:
IF EXISTS(SELECT 1 FROM sys.columns
WHERE Name = N'columnName'
AND Object_ID = Object_ID(N'schemaName.tableName'))
BEGIN
-- Column Exists
END
La version de Martin Smith est plus courte:
IF COL_LENGTH('schemaName.tableName', 'columnName') IS NOT NULL
BEGIN
-- Column Exists
END
Autres conseils
Une version plus concise
IF COL_LENGTH('table_name','column_name') IS NULL
BEGIN
/* Column does not exist or caller does not have permission to view the object */
END
Le point concernant les autorisations sur l'affichage des métadonnées s'applique à toutes les réponses et pas seulement à celle-ci.
Notez que le premier nom de la table de paramètres à COL_LENGTH
peut être en un, deux ou trois formats de nom, selon les besoins.
Un exemple référençant une table dans une base de données différente est
COL_LENGTH('AdventureWorks2012.HumanResources.Department','ModifiedDate')
Une différence avec cette réponse par rapport à l'utilisation des vues de métadonnées est que les fonctions de métadonnées telles que COL_LENGTH
ne renvoient toujours que des données sur les modifications validées, quel que soit le niveau d'isolation en vigueur.
Modifiez les éléments ci-dessous pour répondre à vos besoins spécifiques:
if not exists (select
column_name
from
INFORMATION_SCHEMA.columns
where
table_name = 'MyTable'
and column_name = 'MyColumn')
alter table MyTable add MyColumn int
Modifier pour traiter les modifications> : cela devrait fonctionner - examinez attentivement votre code pour rechercher les erreurs stupides; Interrogez-vous INFORMATION_SCHEMA sur la même base de données que votre insertion, par exemple? Avez-vous une faute de frappe dans votre nom de table / colonne dans l’une ou l’autre déclaration?
Essayez ceci ...
IF NOT EXISTS(
SELECT TOP 1 1
FROM INFORMATION_SCHEMA.COLUMNS
WHERE
[TABLE_NAME] = 'Employees'
AND [COLUMN_NAME] = 'EmployeeID')
BEGIN
ALTER TABLE [Employees]
ADD [EmployeeID] INT NULL
END
Je préférerais INFORMATION_SCHEMA.COLUMNS
à une table système car Microsoft ne garantit pas la préservation des tables système entre les versions. Par exemple, dbo.syscolumns
fonctionne toujours dans SQL 2008, mais il est obsolète et peut être supprimé à tout moment.
Vous pouvez utiliser les vues système du schéma d'informations pour trouver des informations sur les tables qui vous intéressent:
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'yourTableName'
ORDER BY ORDINAL_POSITION
Vous pouvez également interroger des vues, des procédures stockées et pratiquement tout ce qui concerne la base de données à l'aide des vues Information_schema.
Commencez par vérifier si la combinaison table
/ colonne
( id
/ nom
) existe dans dbo .syscolumns
(une table interne SQL Server contenant des définitions de champs) et, si ce n'est pas le cas, émettez la requête ALTER TABLE
appropriée pour l'ajouter. Par exemple:
IF NOT EXISTS ( SELECT *
FROM syscolumns
WHERE id = OBJECT_ID('Client')
AND name = 'Name' )
ALTER TABLE Client
ADD Name VARCHAR(64) NULL
Pour les personnes qui vérifient l'existence de la colonne, supprimez-la.
Dans SQL Server 2016 , vous pouvez utiliser de nouvelles instructions DIE au lieu de grands IF
ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
Essayez quelque chose comme:
CREATE FUNCTION ColumnExists(@TableName varchar(100), @ColumnName varchar(100))
RETURNS varchar(1) AS
BEGIN
DECLARE @Result varchar(1);
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME = @TableName AND COLUMN_NAME = @ColumnName)
BEGIN
SET @Result = 'T'
END
ELSE
BEGIN
SET @Result = 'F'
END
RETURN @Result;
END
GO
GRANT EXECUTE ON [ColumnExists] TO [whoever]
GO
Ensuite, utilisez-le comme ceci:
IF ColumnExists('xxx', 'yyyy') = 'F'
BEGIN
ALTER TABLE xxx
ADD yyyyy varChar(10) NOT NULL
END
GO
Cela devrait fonctionner à la fois avec SQL Server 2000 & amp; SQL Server 2005. Pas sûr de SQL Server 2008, mais vous ne voyez pas pourquoi.
Un bon ami et collègue m'a montré comment utiliser un bloc IF
avec des fonctions SQL OBJECT_ID
et COLUMNPROPERTY
dans SQL SERVER. 2005+ pour rechercher une colonne. Vous pouvez utiliser quelque chose de similaire au suivant:
Vous pouvez voir par vous-même ici
IF (OBJECT_ID(N'[dbo].[myTable]') IS NOT NULL AND
COLUMNPROPERTY( OBJECT_ID(N'[dbo].[myTable]'), 'ThisColumnDoesNotExist', 'ColumnId') IS NULL)
BEGIN
SELECT 'Column does not exist -- You can add TSQL to add the column here'
END
declare @myColumn as nvarchar(128)
set @myColumn = 'myColumn'
if not exists (
select 1
from information_schema.columns columns
where columns.table_catalog = 'myDatabase'
and columns.table_schema = 'mySchema'
and columns.table_name = 'myTable'
and columns.column_name = @myColumn
)
begin
exec('alter table myDatabase.mySchema.myTable add'
+' ['+@myColumn+'] bigint null')
end
Cela a fonctionné pour moi dans SQL 2000:
IF EXISTS
(
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'table_name'
AND column_name = 'column_name'
)
BEGIN
...
END
Essayez ceci
SELECT COLUMNS.*
FROM INFORMATION_SCHEMA.COLUMNS COLUMNS,
INFORMATION_SCHEMA.TABLES TABLES
WHERE COLUMNS.TABLE_NAME = TABLES.TABLE_NAME
AND Upper(COLUMNS.COLUMN_NAME) = Upper('column_name')
J'avais besoin de la même chose pour SQL SERVER 2000 et, comme le souligne @Mitch, cela ne fonctionne que dans 2005 +.
Si cela devait aider quelqu'un d'autre, voici ce qui a fonctionné pour moi à la fin:
if exists (
select *
from
sysobjects, syscolumns
where
sysobjects.id = syscolumns.id
and sysobjects.name = 'table'
and syscolumns.name = 'column')
if exists (
select *
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME = '<table_name>'
and COLUMN_NAME = '<column_name>'
) begin
print 'Column you have specified exists'
end else begin
print 'Column does not exist'
end
IF NOT EXISTS( SELECT NULL
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'tablename'
AND table_schema = 'db_name'
AND column_name = 'columnname') THEN
ALTER TABLE `TableName` ADD `ColumnName` int(1) NOT NULL default '0';
END IF;
select distinct object_name(sc.id)
from syscolumns sc,sysobjects so
where sc.name like '%col_name%' and so.type='U'
Une version de la table temporaire de la réponse acceptée :
if (exists(select 1
from tempdb.sys.columns
where Name = 'columnName'
and Object_ID = object_id('tempdb..#tableName')))
begin
...
end
La réponse de Wheat est bonne, mais suppose que vous n’avez pas de paires nom de table / nom de colonne identiques dans un schéma ou une base de données. Pour le rendre sûr pour cette condition, utilisez cette ...
select *
from Information_Schema.Columns
where Table_Catalog = 'DatabaseName'
and Table_Schema = 'SchemaName'
and Table_Name = 'TableName'
and Column_Name = 'ColumnName'
Il existe plusieurs façons de vérifier l’existence d’une colonne.
Je recommande fortement d'utiliser INFORMATION_SCHEMA.COLUMNS
tel qu'il est créé afin de communiquer avec l'utilisateur.
Considérez les tableaux suivants:
sys.objects
sys.columns
et même certaines autres méthodes d'accès disponibles pour consulter le catalogue système.
De plus, inutile d'utiliser SELECT *
, il suffit de le tester avec valeur NULL
IF EXISTS(
SELECT NULL
FROM INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = 'myTableName'
AND COLUMN_NAME = 'myColumnName'
)
L'une des solutions les plus simples et les plus compréhensibles est la suivante:
IF COL_LENGTH('Table_Name','Column_Name') IS NULL
BEGIN
-- Column Not Exists, implement your logic
END
ELSE
BEGIN
-- Column Exists, implement your logic
END
Voici un script simple que j'utilise pour gérer l'ajout de colonnes dans la base de données:
IF NOT EXISTS (
SELECT *
FROM sys.Columns
WHERE Name = N'QbId'
AND Object_Id = Object_Id(N'Driver')
)
BEGIN
ALTER TABLE Driver ADD QbId NVARCHAR(20) NULL
END
ELSE
BEGIN
PRINT 'QbId is already added on Driver'
END
Dans cet exemple, le nom
est le nom de colonne
à ajouter et id_objet
est le nom de table
La requête ci-dessous peut être utilisée pour vérifier si la colonne recherchée existe ou non dans la table. Nous pouvons également prendre une décision en fonction du résultat recherché, comme indiqué ci-dessous.
IF EXISTS (SELECT 'Y' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = <YourTableName> AND COLUMN_NAME = <YourColumnName>)
BEGIN
SELECT 'Column Already Exists.'
END
ELSE
BEGIN
ALTER TABLE <YourTableName> ADD <YourColumnName> <DataType>[Size]
END
Encore une autre variante ...
SELECT
Count(*) AS existFlag
FROM
sys.columns
WHERE
[name] = N 'ColumnName'
AND [object_id] = OBJECT_ID(N 'TableName')
table - > script table comme - > nouvelles fenêtres - vous avez un script de conception. vérifier et trouver le nom de la colonne dans les nouvelles fenêtres
Exécutez la requête ci-dessous pour vérifier si la colonne existe dans la table donnée:
IF(SELECT COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'TableName' AND COLUMN_NAME = 'ColumnName') IS NOT NULL
PRINT 'Column Exists in the given table';
IF EXISTS(SELECT 1 FROM sys.columns
WHERE Name = N'columnName'
AND Object_ID = Object_ID(N'schemaName.tableName'))
Ce devrait être le moyen le plus simple et le plus simple de résoudre ce problème. J'ai utilisé cela plusieurs fois pour des scénarios similaires. Cela fonctionne comme un charme, aucun doute là-dessus.
IF EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Table Name' and COLUMN_NAME = 'Column Name')
BEGIN
--COLUMNS EXISTS IN TABLE
END
ELSE BEGIN
--COLUMNS DOES NOT EXISTS IN TABLE
END