Frage Wie überprüft man, ob eine Spalte in einer SQL Server-Tabelle vorhanden ist?


Ich muss eine bestimmte Spalte hinzufügen, wenn sie nicht existiert. Ich habe 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?


1567
2017-09-25 12:34


Ursprung


Antworten:


SQL Server 2005 ab:

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

1722
2017-09-25 12:39



Eine prägnantere 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 diesen.

Beachten Sie, dass der Name der ersten Parametertabelle lautet COL_LENGTH kann je nach Bedarf in einem, zwei oder drei Teilen Namensformat sein.

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

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

Ein Unterschied zu dieser Antwort im Vergleich zur Verwendung der Metadatenansichten besteht darin, dass Metadatenfunktionen wie z COL_LENGTH geben immer nur Daten über festgeschriebene Änderungen zurück, unabhängig von der Isolationsstufe.


853
2018-03-20 14:47



Optimieren Sie das Folgende, um Ihre spezifischen Anforderungen zu erfüllen:

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 Bearbeiten zu Fragen umzugehen: Das sollte funktionieren - einen sorgfältigen Blick auf deinen Code für dumme Fehler werfen; Fragen Sie INFORMATION_SCHEMA in der gleichen Datenbank ab, in der Ihre Einfügung zum Beispiel angewendet wird? Haben Sie einen Tippfehler in Ihrem Tabellen- / Spaltennamen?


125
2017-09-25 12:35



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

63
2017-09-25 12:35



ich würde bevorzugen INFORMATION_SCHEMA.COLUMNS über eine Systemtabelle, da Microsoft nicht garantiert, dass die Systemtabellen zwischen den Versionen beibehalten werden. Beispielsweise, dbo.syscolumns funktioniert immer noch in SQL 2008, aber es ist veraltet und könnte in Zukunft jederzeit entfernt werden.


43
2018-06-26 08:58



Sie können die Systemansichten des Informationsschemas verwenden, um so ziemlich alles über die Tabellen herauszufinden, an denen Sie interessiert sind:

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

Sie können auch Ansichten, gespeicherte Prozeduren und so ziemlich alles über die Datenbank mit Hilfe der Information_schema-Ansichten abfragen.


38
2017-09-25 12:37



Überprüfen Sie zuerst, ob die table/column(id/name) Kombination besteht in dbo.syscolumns (eine interne SQL Server-Tabelle, die Felddefinitionen enthält), und falls nicht, geben Sie das entsprechende aus ALTER TABLE Abfrage, um es hinzuzufügen. Beispielsweise:

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



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 auf SQL Server 2000 und SQL Server 2005 funktionieren. Nicht sicher über SQL Server 2008, aber nicht warum nicht sehen.


26
2018-05-01 04:46