Frage

Ich brauche eine bestimmte Spalte hinzufügen, wenn es nicht existiert. Ich habe so etwas wie die folgenden, aber es gibt immer false:

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?

War es hilfreich?

Lösung

SQL Server 2005 an:

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

Martin Smith-Version ist kürzer:

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

Andere Tipps

Eine Kurzfassung

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

Beachten Sie, dass die ersten Parameter Tabellennamen COL_LENGTH sein können ein, zwei oder drei teil~~POS=TRUNC Format nach Bedarf.

Ein Beispiel eine Tabelle in einer anderen Datenbank Referenzierung ist

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

Ein Unterschied mit dieser Antwort im Vergleich zu den Metadaten-Ansichten ist, dass Metadaten-Funktionen wie COL_LENGTH immer nur Daten zurückgeben zu begangen Änderungen unabhängig von der Isolationsstufe in Kraft ist.

Tweak die unter Ihren spezifischen Anforderungen gerecht zu werden:

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 mit Bearbeitungs umgehen zu befragen : Das sollte funktionieren - nehmen einen sorgfältigen Blick über den Code für dumme Fehler; abfragen Sie INFORMATION_SCHEMA auf der gleichen Datenbank wie Ihr Einsatz wird beispielsweise angewendet werden? Haben Sie einen Tippfehler in der Tabelle / Spaltennamen haben in jeder Aussage?

Try this ...

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

würde ich INFORMATION_SCHEMA.COLUMNS über eine Systemtabelle bevorzugen, weil Microsoft garantiert nicht die Systemtabellen zwischen den Versionen zu bewahren. Zum Beispiel funktioniert dbo.syscolumns noch in SQL 2008, aber es ist veraltet und könnte jederzeit in der Zukunft entfernt werden.

Sie können die Informationen Schema Systemansichten verwenden so ziemlich alles über die Tabellen, um herauszufinden, die Sie interessiert:

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

Sie können auch Ansichten abfragen, Stored Procedures und so ziemlich alles über die Datenbank INFORMATION_SCHEMA Ansichten verwendet wird.

Überprüfen Sie zunächst, ob die table / column (id / name) Kombination besteht in dbo.syscolumns (eine interne SQL Server-Tabelle, die Felddefinitionen enthält), und wenn nicht die entsprechende ALTER TABLE Abfrage aus, um es 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

Für die Menschen, die die Spalte Existenz prüft es fallen zu lassen.

In SQL Server 2016 Sie neue DIE Aussagen statt großen IF Wrapper verwenden können

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

Versuchen Sie so 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 ist es wie folgt verwenden:

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

Es sollte sowohl auf SQL Server 2000 und SQL Server arbeiten 2005. Nicht sicher SQL Server 2008, aber nicht sehen, warum nicht.

Ein guter Freund und Kollege von mir hat mir gezeigt, wie man auch eine IF Block mit SQL-Funktionen OBJECT_ID und COLUMNPROPERTY in SQL Server 2005+ für eine Spalte zu überprüfen, verwenden können. Sie können etwas ähnlich der folgenden verwenden:

Sie können sehen Sie sich hier

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

Dieser arbeitete für mich in SQL 2000:

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

Versuchen Sie, diese

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

Ich brauchte ähnlich für SQL Server 2000 und als @Mitch weist darauf hin, das funktioniert nur inm 2005 +.

Sollte es jemand anders helfen, das ist, was für mich am Ende gearbeitet:

if exists (
    select * 
    from 
        sysobjects, syscolumns 
    where 
        sysobjects.id = syscolumns.id 
        and sysobjects.name = 'table' 
        and syscolumns.name = 'column')
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
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;
select distinct object_name(sc.id)
from syscolumns sc,sysobjects so  
where sc.name like '%col_name%' and so.type='U'

Eine temporäre Tabelle Version der akzeptierten Antwort :

if (exists(select 1 
             from tempdb.sys.columns  
            where Name = 'columnName'
              and Object_ID = object_id('tempdb..#tableName')))
begin
...
end

Weizen Antwort ist gut, aber vorausgesetzt, dass Sie haben keine identischen Tabellennamen / Spaltennamen Paare in einem beliebigen Schema oder Datenbank. Damit es sicher für diese Bedingung dieses verwenden ...

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

Es gibt mehrere Möglichkeiten, um die Existenz einer Spalte zu überprüfen. Ich würde dringend zu verwenden INFORMATION_SCHEMA.COLUMNS empfehlen, da es um mit Benutzern zu kommunizieren erstellt wird. Betrachten Sie folgende Tabellen:

 sys.objects
 sys.columns

und sogar einige andere Zugriffsmethoden zur Verfügung system catalog. überprüfen

Auch keine Notwendigkeit SELECT * zu verwenden, einfach testen, indem NULL value

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

Einer der einfache und verständliche Lösung 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

Hier ist ein einfaches Skript, das ich verwende Zusatz von Spalten in der Datenbank zu verwalten:

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 die Name die ColumnName hinzugefügt werden und Object_Id ist die TableName

Unter Abfrage kann verwendet werden, um zu überprüfen, ob gesuchter Spalt vorhanden ist oder nicht in der Tabelle. Wir können Entscheidung treffen, basierend auf dem Suchergebnis auch, wie unten gezeigt.

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

Noch eine andere Variante ...

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

Tabelle -> Script-Tabelle als -> neue Fenster - Sie Design Skript haben. überprüfen und Spaltennamen in einem neuen Fenster

finden

Führen Sie die folgende Abfrage 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';
IF EXISTS(SELECT 1 FROM sys.columns 
      WHERE Name = N'columnName'
      AND Object_ID = Object_ID(N'schemaName.tableName'))
  

Dies sollte den ziemlich einfachen Weg und geradlinig Lösung für dieses Problem sein. Ich habe dies mehrfach für ähnliche Szenarien verwendet. Es wirkt wie ein Zauber, keine Zweifel daran.

IF EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Table Name' and COLUMN_NAME = 'Column Name')

BEGIN
--COLUMNS EXISTS IN TABLE
END

ELSE BEGIN
--COLUMNS DOES NOT EXISTS IN TABLE
END
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top