Vraag Hoe controleer ik of een kolom bestaat in een SQL Server-tabel?


Ik moet een specifieke kolom toevoegen als deze niet bestaat. Ik heb iets als het volgende, maar het geeft altijd false terug:

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

Hoe kan ik controleren of een kolom bestaat in een tabel van de SQL Server-database?


1567
2017-09-25 12:34


oorsprong


antwoorden:


Vanaf SQL Server 2005:

IF EXISTS(SELECT 1 FROM sys.columns 
          WHERE Name = N'columnName'
          AND Object_ID = Object_ID(N'schemaName.tableName'))
BEGIN
    -- Column Exists
END

De versie van Martin Smith is korter:

IF COL_LENGTH('schemaName.tableName', 'columnName') IS NOT NULL
BEGIN
    -- Column Exists
END

1722
2017-09-25 12:39



Een meer beknopte versie

 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

Het punt over machtigingen voor het bekijken van metadata geldt voor alle antwoorden, niet alleen deze.

Merk op dat de eerste parametertabelnaam is ingesteld op COL_LENGTH kan naar wens worden opgemaakt in een naamformaat met één, twee of drie delen.

Een voorbeeld dat verwijst naar een tabel in een andere database is

COL_LENGTH('AdventureWorks2012.HumanResources.Department','ModifiedDate')

Een verschil met dit antwoord vergeleken met het gebruik van de metagegevensweergaven is dat metadatafuncties zoals COL_LENGTH retourneer altijd alleen gegevens over toegezegde wijzigingen, ongeacht het isolatieniveau dat van kracht is.


853
2018-03-20 14:47



Pas de onderstaande aan om aan uw specifieke vereisten te voldoen:

if not exists (select
                     column_name
               from
                     INFORMATION_SCHEMA.columns
               where
                     table_name = 'MyTable'
                     and column_name = 'MyColumn')
    alter table MyTable add MyColumn int

Bewerken om te gaan met bewerken van vraag: Dat zou moeten werken - kijk goed naar je code voor domme fouten; bevraagt ​​u INFORMATION_SCHEMA in dezelfde database als waarop uw invoegtoepassing wordt toegepast? Heeft u een typfout in uw tabel- / kolomnaam in beide instructies?


125
2017-09-25 12:35



Probeer dit...

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

63
2017-09-25 12:35



Ik verkies INFORMATION_SCHEMA.COLUMNS via een systeemtabel omdat Microsoft niet garandeert dat de systeemtabellen tussen versies behouden blijven. Bijvoorbeeld, dbo.syscolumns werkt nog steeds in SQL 2008, maar is verouderd en kan in de toekomst op elk gewenst moment worden verwijderd.


43
2018-06-26 08:58



U kunt de systeemaanzichten van het informatiesysteem gebruiken om vrijwel alles te weten te komen over de tabellen waarin u bent geïnteresseerd:

SELECT *
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE TABLE_NAME = 'yourTableName'
 ORDER BY ORDINAL_POSITION

U kunt ook views, opgeslagen procedures en vrijwel alles over de database ondervragen met behulp van de weergave Information_schema.


38
2017-09-25 12:37



Controleer eerst of het table/column(id/name) combinatie bestaat in dbo.syscolumns (een interne SQL Server-tabel die velddefinities bevat) en, indien niet, de juiste ALTER TABLE vraag om het toe te voegen. Bijvoorbeeld:

IF NOT EXISTS ( SELECT  *
            FROM    syscolumns
            WHERE   id = OBJECT_ID('Client')
                    AND name = 'Name' ) 
ALTER TABLE Client
ADD Name VARCHAR(64) NULL

28
2017-09-25 12:38



Probeer iets als:

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

Gebruik het dan als volgt:

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

Het zou moeten werken op zowel SQL Server 2000 & SQL Server 2005. Niet zeker over SQL Server 2008, maar zie niet waarom niet.


26
2018-05-01 04:46



Voor de mensen die het zuilenbestaan ​​controleren om het te laten vallen.

In SQL Server 2016 je kunt nieuwe DIE-statements gebruiken in plaats van big IF wrappers

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

24
2018-03-03 15:49



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

22
2018-03-20 22:27



Een goede vriend en collega van mij heeft me laten zien hoe je ook een kunt gebruiken IF blokkeren met SQL-functies OBJECT_ID en COLUMNPROPERTY in SQL SERVER 2005+ om te controleren op een kolom. U kunt iets soortgelijks als het volgende gebruiken:

Je kunt het zelf zien

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

21
2017-08-02 19:54