it-swarm.com.de

Wie überprüfe ich, ob eine Spalte in einer SQL Server-Tabelle vorhanden ist?

Ich muss eine bestimmte Spalte hinzufügen, wenn sie nicht vorhanden ist. Ich habe so etwas wie das Folgende, aber es gibt immer falsch zurück:

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

Wie kann ich überprüfen, ob eine Spalte in einer Tabelle der SQL Server-Datenbank vorhanden ist?

1754
Maciej

SQL Server 2005 und höher:

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

Martin Smiths Version ist kürzer:

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

Eine präzisere Version

_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
_

Der Punkt über Berechtigungen zum Anzeigen von Metadaten gilt für alle Antworten, nicht nur für diese.

Beachten Sie, dass der erste Name der Parametertabelle zu COL_LENGTH je nach Bedarf ein, zwei oder dreiteiliger Name sein kann.

Ein Beispiel für die Referenzierung einer Tabelle in einer anderen Datenbank ist

_COL_LENGTH('AdventureWorks2012.HumanResources.Department','ModifiedDate')
_

Ein Unterschied zu dieser Antwort im Vergleich zur Verwendung der Metadatenansichten besteht darin, dass Metadatenfunktionen wie _COL_LENGTH_ unabhängig von der jeweils gültigen Isolationsstufe immer nur Daten zu festgeschriebenen Änderungen zurückgeben.

943
Martin Smith

Passen Sie das Folgende an Ihre spezifischen Anforderungen an:

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

Bearbeiten, um mit dem Bearbeiten der Frage umzugehen: Das sollte funktionieren. Sehen Sie Ihren Code sorgfältig nach dummen Fehlern durch. Fragen Sie INFORMATION_SCHEMA auf derselben Datenbank ab, auf die Ihr Insert beispielsweise angewendet wird? Haben Sie in beiden Anweisungen einen Tippfehler in Ihrem Tabellen-/Spaltennamen?

137
Luke Bennett

Versuche dies...

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

Ich würde INFORMATION_SCHEMA.COLUMNS einer Systemtabelle vorziehen, da Microsoft nicht garantiert, dass die Systemtabellen zwischen den Versionen erhalten bleiben. Beispielsweise funktioniert dbo.syscolumns in SQL 2008 immer noch, aber es ist veraltet und kann jederzeit in Zukunft entfernt werden.

44

Mit den Systemansichten des Informationsschemas können Sie so ziemlich alles über die Tabellen herausfinden, an denen Sie interessiert sind:

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

Mit den Ansichten Information_schema können Sie auch Ansichten, gespeicherte Prozeduren und so ziemlich alles über die Datenbank abfragen.

41
anonymous

Für die Leute, die die Spaltenexistenz überprüfen, um sie fallen zu lassen.

In SQL Server 2016 können Sie neue DIE Anweisungen anstelle von großen IF Wrappern verwenden

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
32

Überprüfen Sie zunächst, ob die Kombination table/column (id/name) in dbo.syscolumns (einer internen SQL Server-Tabelle, die Felddefinitionen enthält) vorhanden ist Setzen Sie die entsprechende ALTER TABLE Abfrage nicht ab, um sie hinzuzufügen. Zum Beispiel:

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

Versuchen Sie etwas wie:

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

Dann benutze es so:

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

Es sollte sowohl auf SQL Server 2000 als auch auf SQL Server 2005 funktionieren. Sie sind sich über SQL Server 2008 nicht sicher, können aber nicht nachvollziehen, warum.

30
Matt Lacey

Ein guter Freund und Kollege von mir hat mir gezeigt, wie man mit einem IF -Block mit den SQL-Funktionen OBJECT_ID und COLUMNPROPERTY in SQL SERVER 2005+ auch nach einer Spalte suchen kann. Sie können Folgendes verwenden:

Sie können sich hier selbst davon überzeugen

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

Das hat bei mir in SQL 2000 funktioniert:

IF EXISTS 
(
    SELECT * 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE table_name = 'table_name' 
    AND column_name = 'column_name'
)
BEGIN
...
END
21
Joe M

Versuche dies

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

Für SQL SERVER 2000 benötigte ich ein ähnliches Programm, und wie @Mitch hervorhebt, funktioniert dies nur in 2005+.

Sollte es jemand anderem helfen, hat dies letztendlich für mich funktioniert:

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

Eine temporäre Tabellenversion von akzeptierte Antwort :

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

Es gibt verschiedene Möglichkeiten, das Vorhandensein einer Spalte zu überprüfen. Ich würde nachdrücklich empfehlen, INFORMATION_SCHEMA.COLUMNS zu verwenden, da es erstellt wurde, um mit dem Benutzer zu kommunizieren. Betrachten Sie folgende Tabellen:

 sys.objects
 sys.columns

und sogar einige andere verfügbare Zugriffsmethoden, um system catalog. zu überprüfen

Sie müssen SELECT * auch nicht verwenden, testen Sie es einfach mit NULL value

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

Die Antwort von Wheat ist gut, setzt jedoch voraus, dass Sie in keinem Schema oder keiner Datenbank identische Paare aus Tabellennamen und Spaltennamen haben. Um es für diese Bedingung sicher zu machen, verwenden Sie diese ...

select *
from Information_Schema.Columns
where Table_Catalog = 'DatabaseName'
  and Table_Schema = 'SchemaName'
  and Table_Name = 'TableName'
  and Column_Name = 'ColumnName'
7

Hier ist ein einfaches Skript, mit dem ich das Hinzufügen von Spalten in der Datenbank verwalte:

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

In diesem Beispiel ist Name das ColumnName, das hinzugefügt werden soll, und Object_Id ist das TableName

6
UJS

Eine der einfachsten und verständlichsten Lösungen ist:

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

Die folgende Abfrage kann verwendet werden, um zu überprüfen, ob die gesuchte Spalte in der Tabelle vorhanden ist oder nicht. Wir können basierend auf dem gesuchten Ergebnis auch wie unten gezeigt eine Entscheidung treffen.

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

Noch eine Variation ...

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

Führen Sie die folgende Abfrage aus, um zu überprüfen, ob die Spalte in der angegebenen Tabelle vorhanden ist:

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

tabelle -> Skripttabelle als -> neues Fenster - Sie haben Entwurfsskript. Überprüfen und finden Sie den Spaltennamen in neuen Fenstern

1
arnav

Ein weiterer Beitrag ist das folgende Beispiel, in dem die Spalte hinzugefügt wird, falls sie nicht vorhanden ist.

    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

Ich hoffe es hilft. 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'))

Dies sollte der einfachere Weg und eine einfache Lösung für dieses Problem sein. Ich habe dies mehrere Male für ähnliche Szenarien verwendet. Es funktioniert wie ein Zauber, keine Zweifel.

0
Ilangeeran