Wie kann man überprüfen, ob eine Spalte in einer Tabelle SQL Server vorhanden ist?
-
02-07-2019 - |
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?
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
findenFü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