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




sql server vnext download (19)

Wheats Antwort ist gut, geht jedoch davon aus, dass Sie in keinem Schema oder in keiner Datenbank identische Paare aus Tabellen- und Spaltennamen haben. Um es für diesen Zustand sicher zu machen, benutze dieses ...

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

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


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 für COL_LENGTH nach Bedarf in einem, zwei oder drei COL_LENGTH kann.

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 COL_LENGTH immer nur Daten zu festgeschriebenen Änderungen zurückgeben, unabhängig von der jeweils COL_LENGTH Isolationsstufe.


Ich brauchte ähnliches für SQL SERVER 2000 und, wie @Mitch hervorhebt, funktioniert das nur in 2005+.

Sollte es jemand anderem helfen, hat das am Ende für mich funktioniert:

if exists (
    select * 
    from 
        sysobjects, syscolumns 
    where 
        sysobjects.id = syscolumns.id 
        and sysobjects.name = 'table' 
        and syscolumns.name = 'column')

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

Für die Leute, die die Spaltenexistenz prüfen, lassen Sie sie fallen.

In SQL Server 2016 können Sie neue DIE-Anweisungen statt großer IF Wrapper verwenden

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

Es gibt verschiedene Möglichkeiten, das Vorhandensein einer Spalte zu überprüfen. Ich würde dringend empfehlen, INFORMATION_SCHEMA.COLUMNS zu verwenden, während es erstellt wird, um mit dem Benutzer zu kommunizieren. Beachten Sie folgende Tabellen:

 sys.objects
 sys.columns

und sogar einige andere Zugriffsmethoden, die verfügbar sind, um den Systemkatalog zu überprüfen.

Es ist auch nicht notwendig, SELECT * zu verwenden, sondern einfach mit einem NULL-Wert zu testen

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

Überprüfen Sie zunächst, ob die Kombination aus table und column ( id / name ) in dbo.syscolumns (einer internen SQL Server-Tabelle mit Felddefinitionen) vorhanden ist, und geben Sie die entsprechende ALTER TABLE Abfrage nicht ein, um sie 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

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

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

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

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'

Ein guter Freund und Kollege von mir zeigte mir, wie man einen IF Block mit den SQL-Funktionen OBJECT_ID und COLUMNPROPERTY in SQL SERVER 2005+ verwenden kann, um nach einer Spalte zu suchen. Sie können etwas ähnlich dem folgenden verwenden:

Sie können sich hier selbst sehen

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

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.


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 mithilfe der Information_schema-Ansichten abfragen.


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

Eine temporäre Tabelle der angenommenen Antwort :

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

Noch eine Variation ...

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

Hier ist ein einfaches Skript, das ich verwende, um das Hinzufügen 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 der Name der ColumnName , der hinzugefügt werden soll, und Object_Id ist der TableName





sql-server-2016