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?
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
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.
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?
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
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.
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.
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
Ü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
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.
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
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
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
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')
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')
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;
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
select distinct object_name(sc.id)
from syscolumns sc,sysobjects so
where sc.name like '%col_name%' and so.type='U'
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'
)
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'
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
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
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
Noch eine Variation ...
SELECT
Count(*) AS existFlag
FROM
sys.columns
WHERE
[name] = N 'ColumnName'
AND [object_id] = OBJECT_ID(N 'TableName')
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';
tabelle -> Skripttabelle als -> neues Fenster - Sie haben Entwurfsskript. Überprüfen und finden Sie den Spaltennamen in neuen Fenstern
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
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
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.