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




vérifier si une entrée existe dans la base de données (19)

L'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

Je dois ajouter une colonne spécifique si elle n'existe pas. J'ai quelque chose comme ça, mais ça renvoie 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 base de données SQL Server?


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

Alors utilisez-le comme ceci:

IF ColumnExists('xxx', 'yyyy') = 'F'
BEGIN
  ALTER TABLE xxx
  ADD yyyyy varChar(10) NOT NULL
END
GO

Il 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.


Je préférerais INFORMATION_SCHEMA.COLUMNS sur une table système car Microsoft ne garantit pas de conserver les tables système entre les versions. Par exemple, dbo.syscolumns fonctionne toujours dans SQL 2008, mais il est obsolète et pourrait être supprimé à tout moment à l'avenir.


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 exists'
  end

select distinct object_name(sc.id)
from syscolumns sc,sysobjects so  
where sc.name like '%col_name%' and so.type='U'

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;

Vérifiez d'abord si la combinaison table / column ( id / name ) existe dans dbo.syscolumns (une table SQL Server interne qui contient des définitions de champ) et, sinon, ALTER TABLE 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

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


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

Une version de 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

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') 

SQL Server 2005 à partir de:

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

Encore une autre variation ...

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

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 d'autres méthodes d'accès disponibles pour vérifier le catalogue système.

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

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

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

Pour les personnes qui vérifient l'existence de la colonne pour le laisser tomber.

Dans SQL Server 2016, vous pouvez utiliser de nouvelles instructions DIE au lieu de grandes enveloppes IF

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

Un bon ami et collègue m'a montré comment utiliser un bloc IF avec les fonctions SQL COLUMNPROPERTY et COLUMNPROPERTY dans SQL SERVER 2005+ pour vérifier 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

J'avais besoin de similaire pour SQL SERVER 2000 et, comme le souligne @Mitch, cela ne fonctionne que depuis 2005+.

Si ça aide quelqu'un d'autre, c'est 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')

Tweak 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 avec modifier à la question : Cela devrait fonctionner - regardez attentivement votre code pour les erreurs stupides; interrogez-vous INFORMATION_SCHEMA sur la même base de données lorsque votre insertion est appliquée par exemple? Avez-vous une faute de frappe dans votre nom de table / colonne dans l'une ou l'autre des déclarations?







sql-server-2016