Come verificare se esiste una colonna in una tabella di SQL Server?
-
02-07-2019 - |
Domanda
Devo aggiungere una colonna specifica se non esiste. Ho qualcosa di simile al seguente, ma restituisce sempre false:
IF EXISTS(SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'myTableName'
AND COLUMN_NAME = 'myColumnName')
Come posso verificare se esiste una colonna in una tabella del database di SQL Server?
Soluzione
SQL Server 2005 in poi:
IF EXISTS(SELECT 1 FROM sys.columns
WHERE Name = N'columnName'
AND Object_ID = Object_ID(N'schemaName.tableName'))
BEGIN
-- Column Exists
END
La versione di Martin Smith è più breve:
IF COL_LENGTH('schemaName.tableName', 'columnName') IS NOT NULL
BEGIN
-- Column Exists
END
Altri suggerimenti
Una versione più concisa
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
Il punto sulle autorizzazioni per la visualizzazione dei metadati si applica a tutte le risposte, non solo a questa.
Nota che il primo nome della tabella dei parametri è COL_LENGTH
può essere nel formato di uno, due o tre nomi, come richiesto.
Un esempio che fa riferimento a una tabella in un database diverso è
COL_LENGTH('AdventureWorks2012.HumanResources.Department','ModifiedDate')
Una differenza con questa risposta rispetto all'utilizzo delle visualizzazioni dei metadati è che le funzioni di metadati come COL_LENGTH
restituiscono sempre solo i dati sulle modifiche impegnate, indipendentemente dal livello di isolamento in vigore.
Modifica di seguito per soddisfare i tuoi requisiti specifici:
if not exists (select
column_name
from
INFORMATION_SCHEMA.columns
where
table_name = 'MyTable'
and column_name = 'MyColumn')
alter table MyTable add MyColumn int
Modifica per gestire la modifica su domanda : dovrebbe funzionare: controlla attentamente il codice per individuare errori stupidi; stai richiedendo ad esempio INFORMATION_SCHEMA sullo stesso database a cui viene applicato l'inserimento? Hai un refuso nel nome della tabella / colonna in entrambe le istruzioni?
Prova questo ...
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
Preferirei INFORMATION_SCHEMA.COLUMNS
su una tabella di sistema perché Microsoft non garantisce la conservazione delle tabelle di sistema tra le versioni. Ad esempio, dbo.syscolumns
funziona ancora in SQL 2008, ma è obsoleto e potrebbe essere rimosso in qualsiasi momento in futuro.
Puoi usare le viste di sistema dello schema di informazioni per scoprire praticamente qualsiasi cosa sulle tabelle che ti interessano:
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'yourTableName'
ORDER BY ORDINAL_POSITION
Puoi anche interrogare viste, procedure memorizzate e praticamente qualsiasi cosa sul database usando le viste Information_schema.
Verifica innanzitutto se la combinazione table
/ column
( id
/ name
) esiste in dbo .syscolumns
(una tabella interna di SQL Server che contiene le definizioni dei campi) e, in caso contrario, emettere la query ALTER TABLE
appropriata per aggiungerla. Ad esempio:
IF NOT EXISTS ( SELECT *
FROM syscolumns
WHERE id = OBJECT_ID('Client')
AND name = 'Name' )
ALTER TABLE Client
ADD Name VARCHAR(64) NULL
Per le persone che stanno controllando l'esistenza della colonna per lasciarla cadere.
In SQL Server 2016 puoi utilizzare le nuove istruzioni DIE anziché i grandi wrapper IF
ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
Prova qualcosa del tipo:
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
Quindi usalo in questo modo:
IF ColumnExists('xxx', 'yyyy') = 'F'
BEGIN
ALTER TABLE xxx
ADD yyyyy varChar(10) NOT NULL
END
GO
Dovrebbe funzionare su SQL Server 2000 e amp; SQL Server 2005. Non sei sicuro di SQL Server 2008, ma non capisco perché no.
Un mio caro amico e collega mi ha mostrato come utilizzare anche un blocco IF
con funzioni SQL OBJECT_ID
e COLUMNPROPERTY
in SQL SERVER 2005+ per verificare la presenza di una colonna. Puoi usare qualcosa di simile al seguente:
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
Questo ha funzionato per me in SQL 2000:
IF EXISTS
(
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'table_name'
AND column_name = 'column_name'
)
BEGIN
...
END
Prova questo
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')
Avevo bisogno di simili per SQL SERVER 2000 e, come sottolinea @Mitch, questo funziona solo nel 2005+.
Dovrebbe aiutare qualcun altro, questo è ciò che ha funzionato per me alla fine:
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'
Una versione della tabella temporanea della risposta accettata :
if (exists(select 1
from tempdb.sys.columns
where Name = 'columnName'
and Object_ID = object_id('tempdb..#tableName')))
begin
...
end
La risposta di Wheat è buona, ma presuppone che non vi siano coppie identiche di nome tabella / colonna in nessuno schema o database. Per renderlo sicuro per quella condizione usa questo ...
select *
from Information_Schema.Columns
where Table_Catalog = 'DatabaseName'
and Table_Schema = 'SchemaName'
and Table_Name = 'TableName'
and Column_Name = 'ColumnName'
Esistono diversi modi per verificare l'esistenza di una colonna.
Consiglio vivamente di usare INFORMATION_SCHEMA.COLUMNS
come è stato creato per comunicare con l'utente.
Prendi in considerazione le seguenti tabelle:
sys.objects
sys.columns
e anche alcuni altri metodi di accesso disponibili per controllare catalogo di sistema.
Inoltre, non è necessario utilizzare SELECT *
, è sufficiente testarlo con valore NULL
IF EXISTS(
SELECT NULL
FROM INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = 'myTableName'
AND COLUMN_NAME = 'myColumnName'
)
Una delle soluzioni più semplici e comprensibili è:
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
Ecco un semplice script che uso per gestire l'aggiunta di colonne nel database:
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 questo esempio, il Nome
è il ColumnName
da aggiungere e Object_Id
è il TableName
La query sottostante può essere utilizzata per verificare se esiste una colonna cercata nella tabella. Possiamo prendere una decisione in base al risultato cercato anche come mostrato di seguito.
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
Ancora un'altra variante ...
SELECT
Count(*) AS existFlag
FROM
sys.columns
WHERE
[name] = N 'ColumnName'
AND [object_id] = OBJECT_ID(N 'TableName')
table - > script table as - > new windows - hai uno script di progettazione. controlla e trova il nome della colonna in nuove finestre
Esegui la query seguente per verificare se la colonna esiste nella tabella fornita:
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'))
Questo dovrebbe essere il modo più semplice e la soluzione diretta a questo problema. L'ho usato più volte per scenari simili. Funziona come un incantesimo, non ci sono dubbi.
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