2173 Stimmen

Wie man überprüft, ob eine Spalte in einer SQL Server-Tabelle existiert

Ich muss eine spezifische Spalte hinzufügen, wenn sie nicht existiert. Ich habe etwas Ähnliches wie das Folgende, aber es gibt immer false 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 existiert?

18 Stimmen

Ich glaube eigentlich nicht, dass etwas mit dem Code in der Frage falsch ist: Funktioniert gut für mich in 2008 R2. (Vielleicht haben Sie es in der falschen Datenbank ausgeführt? Vielleicht war Ihre Datenbank großgeschrieben und Sie hatten die Groß- und Kleinschreibung in Ihren myTableName / myColumnName-Strings nicht richtig? Diese Art von Abfrage scheint flexibler zu sein als die COL_LENGTH-Lösung: Ich kann sie gegen eine andere Datenbank ausführen und sogar über einen Datenbanklink, indem ich "INFORMATION_SCHEMA" entsprechend voranstellen. Konnte das nicht mit der METADATEN-Funktion COL_LENGTH sehen.

4 Stimmen

@mwardm - COL_LENGTH('AdventureWorks2012.HumanResources.Department ','ModifiedDate') funktioniert gut.

7 Stimmen

Kleiner verwandter Hinweis: Wenn Sie eine Spalte direkt nach der Spaltenhinzufügung aktualisieren möchten (ich glaube, viele Benutzer haben nach diesem Artikel zu diesem Zweck gesucht), könnten Sie EXEC sp_executesql mit dem geformten UPDATE Statement verwenden.

2371voto

Mitch Wheat Punkte 287474

SQL Server 2005 und spätere Versionen:

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

Martins Smiths Version ist kürzer:

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

4 Stimmen

In der Version von Martin Smith ist zu erwähnen, dass der Spaltenname nicht innerhalb eckiger Klammern [ ] enthalten sein sollte. Wenn der Spaltenname innerhalb eckiger Klammern [ ] steht, wird er selbst dann null zurückgeben, wenn die Spalte in der Tabelle existiert

0 Stimmen

@HemendraSinghChauhan - das liegt daran, dass sie kein Teil des Namens sind. Sie werden auch feststellen, dass dies der Fall ist, wenn Sie den Namen in sys.columns vergleichen.

0 Stimmen

@MartinSmith wusste das nicht, ich benutzte deine Antwort und stieß darauf. Normalerweise verwende ich eckige Klammern beim Hinzufügen von Spalten, daher habe ich sie auch in der COL_LENGTH Funktion verwendet. Mein Code sah so aus: Alter table Table_Name Add [ColumnName] NVarchar(max) NULL; Select COL_LENGTH('[TABLE_NAME]', '[COLUMN_NAME]')

1156voto

Martin Smith Punkte 417623

Eine prägnantere Version

IF COL_LENGTH('table_name','column_name') IS NULL
BEGIN
/* Spalte existiert nicht oder der Aufrufer hat keine Berechtigung, das Objekt anzuzeigen */
END

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

Beachten Sie, dass der erste Parameter Tabellenname zu COL_LENGTH im erforderlichen Ein-, Zwei- oder Dreiteilnamenformat angegeben werden kann.

Ein Beispiel, das auf eine Tabelle in einer anderen Datenbank verweist, lautet:

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

Ein Unterschied zu dieser Antwort im Vergleich zur Verwendung der Metadatenansichten besteht darin, dass Metadatenfunktionen wie COL_LENGTH immer nur Daten über abgeschlossene Änderungen zurückgeben, unabhängig vom gültigen Isolationsgrad.

15 Stimmen

Dies ist weniger lesbar als einige der anderen Antworten, wahrscheinlich der Grund, warum es nicht so hoch bewertet wird.

45 Stimmen

@Bill - Inwiefern weniger lesbar? Sieht in Firefox gut aus. Diese Antwort wurde mehr als 2 Jahre später als die akzeptierte gepostet, was meiner Meinung nach die Bewertung erklärt. Wenn du meintest, dass es weniger klar ist, dass es sich um eine Existenzprüfung handelt, ist diese Art von Idiom in SQL Server ziemlich verbreitet. z.B. mit IF OBJECT_ID('TableName','U') IS NULL um die Existenz eines Objekts zu prüfen oder DB_ID('foo') um die Existenz einer Datenbank zu prüfen.

71 Stimmen

@MartinSmith Ich bin mir sicher, er meinte weniger lesbar, weil wenn Sie dieses Idiom nicht kennen und Sie diesen Code von jemand anderem geerbt haben, würden Sie nicht sofort verstehen, was der Code macht. So ähnlich wie x>>2 anstelle von x/4 in C++ zu schreiben. Der ausführlichere Code (if exists (select column_name from information_schema ...)) nimmt viel mehr Platz ein, aber niemand würde jemals ratlos dastehen, um herauszufinden, was er macht.

178voto

Luke Bennett Punkte 32186

Passen Sie das unten stehende an, um Ihren spezifischen Anforderungen zu entsprechen:

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

Das sollte funktionieren - überprüfen Sie Ihren Code sorgfältig auf dumme Fehler. Sind Sie zum Beispiel dabei, die INFORMATION_SCHEMA in der gleichen Datenbank abzufragen, auf die Ihr Einfügen angewendet wird? Haben Sie einen Tippfehler in Ihrem Tabellen-/Spaltennamen in einer der Anweisungen?

6 Stimmen

Ich habe gerade herausgefunden, dass das Hinzufügen von TABLE_SCHEMA = 'mySchema' nach dem WHERE-Statement das Problem behebt.

13 Stimmen

-1: Beantwortet die Frage des OP nicht, fügt nur die neue Information hinzu, wie man eine neue Spalte hinzufügt, obwohl der OP überhaupt nicht danach gefragt hat, geht nicht auf den Kommentar des OP ein.

4 Stimmen

+1 Antwortet perfekt auf die Frage des OPs mit einem Bonus an zusätzlichen Informationen, nach denen der OP sowieso gesucht hat. Und das war genau das, wonach ich gesucht habe.

90voto

Leon Tayson Punkte 4407

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

6 Stimmen

Diese Methode funktioniert auch mit SQL CE, während einige der anderen erwähnten Methoden dies nicht tun.

9 Stimmen

Sie können SELECT 1 anstelle von SELECT TOP 1 1 verwenden ;).

6 Stimmen

Innerhalb einer EXISTS-Anweisung optimiert SQL automatisch die Spalten (ähnlich wie bei count(*)), sodass SELECT * ausreicht.

84voto

Pரதீப் Punkte 88269

Für diejenigen, die die Spaltenexistenz überprüfen, bevor sie sie ablegen.

Von SQL Server 2016 können Sie neue DIE (Drop If Exists) Anweisungen anstelle von großen IF -Blöcken verwenden

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

1 Stimmen

Aber da ist kein "DIE" darin(?). Was ist die Erklärung? Bitte klären Sie dies, indem Sie die Antwort ändern, nicht hier in Kommentaren (aber ohne "Bearbeiten:", "Aktualisieren:", oder ähnlich - die Antwort sollte so erscheinen, als ob sie heute geschrieben wurde). Können Sie unabhängig davon auf die Dokumentation verlinken?

3 Stimmen

Ist es möglich, das Gegenteil davon zu tun? wie ALTER TABLE table_name ADD COLUMN IF NOT EXISTS ?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X