web-dev-qa-db-fra.com

Comment vérifier si une colonne existe dans une table SQL Server?

J'ai besoin d'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?

1754
Maciej

SQL Server 2005 et suivants:

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
1934
Mitch Wheat

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 table de paramètres à COL_LENGTH peut être au format de nom à un, deux ou trois parties, 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_ renvoient toujours uniquement les données sur les modifications validées, quel que soit le niveau d'isolation en vigueur.

943
Martin Smith

Ajustez le 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

Édition pour traiter éditer en question: 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 les deux déclarations?

137
Luke Bennett

Essaye ça...

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
71
Leon Tayson

Je préférerais INFORMATION_SCHEMA.COLUMNS par rapport à une table système car Microsoft ne garantit pas la conservation 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.

44
Christian Hayter

Vous pouvez utiliser les vues système des schémas 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.

41
anonymous

Pour les personnes qui vérifient l'existence de la colonne, supprimez-la.

Dans SQL Server 2016, vous pouvez utiliser les nouvelles instructions DIE à la place des grands wrappers IF.

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
32

Commencez par vérifier si la combinaison table/column (_ (id/name) existe dans dbo.syscolumns (une table interne SQL Server contenant des définitions de champ), et si n'émettez pas 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
32
mdb

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 sur SQL Server 2000 et SQL Server 2005. Vous n'êtes pas sûr de SQL Server 2008, mais vous ne voyez pas pourquoi.

30
Matt Lacey

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 à ce qui suit:

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
25
brazilianldsjaguar
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'
    +'    ['[email protected]+'] bigint       null')
end
24

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
21
Joe M

Essaye ça

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') 
20
Douglas Tondo

J'avais besoin de la même chose pour SQL SERVER 2000 et, comme @Mitch le souligne, 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')
18
FrostbiteXIII
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
15
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;
11
Na30m

Une version de la table temporaire du réponse acceptée :

if (exists(select 1 
             from tempdb.sys.columns  
            where Name = 'columnName'
              and Object_ID = object_id('tempdb..#tableName')))
begin
...
end
10
crokusek
select distinct object_name(sc.id)
from syscolumns sc,sysobjects so  
where sc.name like '%col_name%' and so.type='U'
10
Nishad

Il existe plusieurs façons de vérifier l’existence d’une colonne. Je recommande fortement d'utiliser INFORMATION_SCHEMA.COLUMNS comme il est créé pour communiquer avec l'utilisateur. Considérez les tableaux suivants:

 sys.objects
 sys.columns

et même d'autres méthodes d'accès disponibles pour vérifier system catalog.

Aussi, pas besoin d'utiliser SELECT *, il suffit de le tester par NULL value

IF EXISTS(
           SELECT NULL 
           FROM INFORMATION_SCHEMA.COLUMNS
           WHERE
             TABLE_NAME = 'myTableName'
             AND COLUMN_NAME = 'myColumnName'
         ) 
7
Ali Elmi

La réponse de Wheat est bonne, mais suppose que vous ne disposez d'aucune paire identique de nom de table/nom de colonne 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'
7
Daniel Barbalace

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, la Name est la ColumnName à ajouter et Object_Id est la TableName

6
UJS

Une des solutions les plus simples et compréhensibles est:

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
6
Arsman Ahmad

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
4
Suraj Kumar

Encore une autre variation ...

SELECT 
  Count(*) AS existFlag 
FROM 
  sys.columns 
WHERE 
  [name] = N 'ColumnName' 
  AND [object_id] = OBJECT_ID(N 'TableName')
3
Manuel Alves

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';
1
S Krishna

table -> script table as -> nouvelle fenêtre - vous avez un script de conception. vérifier et trouver le nom de la colonne dans les nouvelles fenêtres

1
arnav

Une autre contribution est l'exemple suivant qui ajoute la colonne si elle n'existe pas.

    USE [Northwind]
    GO

    IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
                    WHERE TABLE_NAME = 'Categories'
                        AND COLUMN_NAME = 'Note')
    BEGIN

    ALTER TABLE Categories ADD Note NVARCHAR(800) NULL

    END
    GO

J'espère que ça aide. Simone

0
Simone Spagna
IF EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_CATALOG = 'Database Name'
and TABLE_SCHEMA = 'Schema Name'
and TABLE_NAME = 'Table Name'
and COLUMN_NAME = 'Column Name'
and DATA_TYPE = 'Column Type') -- Where statement lines can be deleted.

BEGIN
--COLUMN EXISTS IN TABLE
END

ELSE BEGIN
--COLUMN DOES NOT EXISTS IN TABLE
END
0
IF EXISTS(SELECT 1 FROM sys.columns 
      WHERE Name = N'columnName'
      AND Object_ID = Object_ID(N'schemaName.tableName'))

Cela devrait être la solution la plus simple et la plus simple à ce problème. J'ai utilisé cela plusieurs fois pour des scénarios similaires. Cela fonctionne comme un charme, aucun doute sur cela.

0
Ilangeeran