¿Cómo verificar si existe una columna en una tabla de SQL Server?
Frecuentes
Visto 1,299 equipos
1935
Necesito agregar una columna específica si no existe. Tengo algo como lo siguiente, pero siempre devuelve falso:
IF EXISTS(SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'myTableName'
AND COLUMN_NAME = 'myColumnName')
¿Cómo puedo verificar si existe una columna en una tabla de la base de datos de SQL Server?
30 Respuestas
2142
SQL Server 2005 en adelante:
IF EXISTS(SELECT 1 FROM sys.columns
WHERE Name = N'columnName'
AND Object_ID = Object_ID(N'schemaName.tableName'))
BEGIN
-- Column Exists
END
La versión de Martin Smith es más corta:
IF COL_LENGTH('schemaName.tableName', 'columnName') IS NOT NULL
BEGIN
-- Column Exists
END
Respondido 12 Abr '17, 04:04
En la versión de Martin Smith, una cosa a mencionar es no incluir columnName entre corchetes []. Cuando columnName está entre corchetes [], dará un valor nulo incluso si la columna existe en la tabla - Hemendra
@HemendraSinghChauhan, eso es porque no son parte del nombre. También encontrará que al comparar con el nombre en sys.columns
- Martin Smith
@MartinSmith no sabía eso, estaba usando tu respuesta y encontré esto. Generalmente uso corchetes al agregar columnas, así que también los usé dentro de la función COL_LENGTH. Mi código era así: Alter table Table_Name Add [ColumnName] NVarchar(max) NULL; Select COL_LENGTH('[TABLE_NAME]', '[COLUMN_NAME]')
- Hemendra
sí, eso no es válido. Los argumentos para COL_LENGTH
necesita estar sin comillas. Teóricamente es posible que alguien cree una columna que realmente tenga un nombre de [COLUMN_NAME]
- p.ej CREATE TABLE #T([[COLUMN_NAME]]] INT); SELECT * FROM #T
y luego sería ambiguo si esta no fuera la regla. - Martin Smith
La versión más corta no funciona cuando el campo id varchar (max) = nulo - AlejandroDG
1026
Una versión más 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
El punto sobre los permisos para ver metadatos se aplica a todas las respuestas, no solo a esta.
Tenga en cuenta que el primer nombre de la tabla de parámetros COL_LENGTH
puede estar en formato de nombre de una, dos o tres partes, según sea necesario.
Un ejemplo que hace referencia a una tabla en una base de datos diferente es
COL_LENGTH('AdventureWorks2012.HumanResources.Department','ModifiedDate')
Una diferencia con esta respuesta en comparación con el uso de las vistas de metadatos es que los metadatos funcionan como COL_LENGTH
siempre solo devuelve datos sobre cambios comprometidos independientemente del nivel de aislamiento en vigor.
Respondido 22 Oct 18, 08:10
Esto es menos legible que algunas de las otras respuestas, probablemente por qué no tiene una calificación tan alta. - proyecto de ley yang
@Bill - ¿Menos legible de qué manera? Se ve bien en Firefox. Esta respuesta se publicó más de 2 años después de la aceptada, lo que explica la calificación IMO. Si quiso decir menos claro que es una existencia, verifique que este tipo de lenguaje es bastante común en SQL Server. por ejemplo, usando IF OBJECT_ID('TableName','U') IS NULL
para comprobar la existencia del objeto o DB_ID('foo')
para comprobar la existencia de la base de datos. - Martin Smith
@MartinSmith Estoy seguro de que se refería a menos legible porque si no conocieras este idioma y heredaras este código de otra persona, no entenderías de inmediato lo que hace el código. Como escribir x>>2
en lugar de x/4
en C ++. El código más detallado (if exists (select column_name from information_schema ...)
) ocupa mucho más espacio, pero nadie se rascaría la cabeza tratando de averiguar qué hace. - Kip
Además de ser más conciso, esta es una solución mucho más rápida. Accediendo INFORMATION_SCHEMA
vistas o sys.columns
golpea el disco, mientras COL_LENGTH
utiliza metadatos de la base de datos en caché. - wqw
Probablemente esta no sea la respuesta mejor calificada porque se dio 2.5 años después de la otra. Es por eso que siempre verifico las fechas cuando comparo las calificaciones en dos respuestas. Se necesita mucho más tiempo para superar una respuesta que se dio mucho antes. ;) - Sean
152
Modifique lo siguiente para que se adapte a sus requisitos específicos:
if not exists (select
column_name
from
INFORMATION_SCHEMA.columns
where
table_name = 'MyTable'
and column_name = 'MyColumn')
alter table MyTable add MyColumn int
Editar para tratar con editar para pregunta: Eso debería funcionar - revise cuidadosamente su código en busca de errores estúpidos; ¿está consultando INFORMACIÓN_SCHEMA en la misma base de datos a la que se aplica su inserción, por ejemplo? ¿Tiene un error tipográfico en el nombre de su tabla / columna en alguna de las declaraciones?
Respondido el 31 de diciembre de 14 a las 08:12
Acabo de descubrir que agregar TABLE_SCHEMA = 'mySchema' después de donde la cláusula soluciona el problema. - Maciej
-1: no responde a la pregunta de OP, solo agrega la nueva información sobre cómo agregar una nueva columna a pesar de que OP no pregunta sobre eso en absoluto, no aborda el comentario de OP. - ANeves piensa que SE es malvado
+1 Responde a la pregunta de OP perfectamente con una bonificación de la información adicional que el OP estaba buscando a continuación de todos modos. Y esto era lo que estaba buscando. - Azul amargo
77
Prueba esto ...
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
respondido 14 nov., 11:07
Este método también funciona con SQL CE, mientras que algunos de los otros métodos mencionados no lo hacen. - Tragamonedas
Puedes usar SELECT 1
en lugar de SELECT TOP 1 1
;). - mierda
Dentro de un EXISTS
declaración SQL optimiza automáticamente las columnas (al igual que count(*)
) entonces SELECT *
Será suficiente. - Marc L.
En aras de la integridad, debería considerar agregar and [TABLE_SCHEMA] = '???'
a la cláusula WHERE. - andres jens
56
Para las personas que están comprobando la existencia de la columna antes de dejarla caer.
Desde SQL Server 2016 puede usar nuevas declaraciones DIE en lugar de grandes IF
envolvedoras
ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
Respondido 18 Feb 21, 15:02
49
preferiría INFORMATION_SCHEMA.COLUMNS
sobre una tabla del sistema porque Microsoft no garantiza la conservación de las tablas del sistema entre versiones. Por ejemplo, dbo.syscolumns
todavía funciona en SQL 2008, pero está obsoleto y podría eliminarse en cualquier momento en el futuro.
Respondido el 26 de junio de 09 a las 09:06
Pues sí, eso no hace falta decirlo desde INFORMATION_SCHEMA
Las vistas contienen solo metadatos estándar ANSI. Sin embargo, eso es suficiente para una prueba de existencia. - Christian Hayter
Microsoft dice "En versiones futuras de SQL Server, Microsoft puede aumentar la definición de cualquier vista de catálogo del sistema agregando columnas al final de la lista de columnas. Recomendamos no usar la sintaxis SELECT * FROM sys.catalog_view_name en el código de producción porque el número de las columnas devueltas pueden cambiar e interrumpir su aplicación ". Eso implica que no eliminarán columnas ni cambiarán su orden. Eso es lo suficientemente buena compatibilidad con versiones anteriores para todos los casos excepto los extremos. - sirir
43
Puede utilizar las vistas del sistema de esquema de información para averiguar prácticamente cualquier cosa sobre las tablas que le interesan:
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'yourTableName'
ORDER BY ORDINAL_POSITION
También puede interrogar vistas, procedimientos almacenados y prácticamente cualquier cosa sobre la base de datos utilizando las vistas Information_schema.
Respondido el 25 de Septiembre de 08 a las 13:09
Esto es exactamente lo que está usando el cuestionario, necesitaba saber cómo agregar la columna si no existía. - Birel
36
Intenta algo como:
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
Entonces úsalo así:
IF ColumnExists('xxx', 'yyyy') = 'F'
BEGIN
ALTER TABLE xxx
ADD yyyyy varChar(10) NOT NULL
END
GO
Debería funcionar tanto en SQL Server 2000 como en SQL Server 2005. No estoy seguro acerca de SQL Server 2008, pero no veo por qué no.
Respondido el 15 de junio de 15 a las 13:06
35
Primero compruebe si el table
/column
(id
/name
) combinación existe en dbo.syscolumns
(una tabla interna de SQL Server que contiene definiciones de campo) y, de no ser así, emita el ALTER TABLE
consulta para agregarlo. Por ejemplo:
IF NOT EXISTS ( SELECT *
FROM syscolumns
WHERE id = OBJECT_ID('Client')
AND name = 'Name' )
ALTER TABLE Client
ADD Name VARCHAR(64) NULL
Respondido el 15 de junio de 15 a las 13:06
28
Un buen amigo y colega me enseñó cómo también se puede utilizar un IF
bloque con funciones SQL OBJECT_ID
y COLUMNPROPERTY
en SQL SERVER 2005+ para buscar una columna. Puede usar algo similar a lo siguiente:
Puedes verlo por ti mismo aquí
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
respondido 21 mar '13, 17:03
Y, por supuesto, si está seguro de que la tabla existe, puede omitir la primera parte de la condición y verificar COLUMNPROPERTY
solo. - ruud helderman
27
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
respondido 03 mar '11, 15:03
23
Esto funcionó para mí en SQL 2000:
IF EXISTS
(
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'table_name'
AND column_name = 'column_name'
)
BEGIN
...
END
respondido 23 mar '17, 19:03
22
Prueba esta
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')
Respondido el 21 de diciembre de 14 a las 14:12
No necesitas INFORMATION_SCHEMA.TABLES
y no filtra columnas para una tabla específica, por lo que a veces devolverá más de una fila para los mismos nombres de columna en tablas separadas;). - mierda
19
Necesitaba algo similar para SQL SERVER 2000 y, como señala @Mitch, esto solo funciona en 2005+.
Si ayuda a alguien más, esto es lo que funcionó para mí al final:
if exists (
select *
from
sysobjects, syscolumns
where
sysobjects.id = syscolumns.id
and sysobjects.name = 'table'
and syscolumns.name = 'column')
respondido 16 mar '17, 07:03
15
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
respondido 07 mar '19, 06:03
14
IF NOT EXISTS( SELECT NULL
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'TableName'
AND table_schema = 'SchemaName'
AND column_name = 'ColumnName') BEGIN
ALTER TABLE [SchemaName].[TableName] ADD [ColumnName] int(1) NOT NULL default '0';
END;
Respondido el 17 de Septiembre de 19 a las 02:09
Creo que te refieres a table_schema = 'schema_name'. - tab aleman
11
Una versión de tabla temporal del respuesta aceptada:
if (exists(select 1
from tempdb.sys.columns
where Name = 'columnName'
and Object_ID = object_id('tempdb..#tableName')))
begin
...
end
contestado el 23 de mayo de 17 a las 12:05
¿En qué se diferencia eso de la respuesta aceptada? ¿No funcionaría una tabla temporal en la respuesta aceptada? - Juan Saunders
Correcto. La respuesta aceptada no funciona para tablas temporales porque 'sys.columns' debe especificarse como 'tempdb.sys.columns' y el nombre de la tabla debe estar precedido por 'tempdb ..'. - crokusek
10
select distinct object_name(sc.id)
from syscolumns sc,sysobjects so
where sc.name like '%col_name%' and so.type='U'
Respondido el 06 de diciembre de 13 a las 15:12
8
La respuesta de Wheat es buena, pero asume que no tiene pares idénticos de nombre de tabla / nombre de columna en ningún esquema o base de datos. Para que sea seguro para esa condición, use esto ...
select *
from Information_Schema.Columns
where Table_Catalog = 'DatabaseName'
and Table_Schema = 'SchemaName'
and Table_Name = 'TableName'
and Column_Name = 'ColumnName'
respondido 26 mar '15, 17:03
8
Hay varias formas de comprobar la existencia de una columna. Recomiendo encarecidamente usar INFORMATION_SCHEMA.COLUMNS
tal como se crea para comunicarse con el usuario. Considere las siguientes tablas:
sys.objects
sys.columns
e incluso algunos otros métodos de acceso disponibles para comprobar system catalog.
Además, no es necesario usar SELECT *
, simplemente pruébelo NULL value
IF EXISTS(
SELECT NULL
FROM INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = 'myTableName'
AND COLUMN_NAME = 'myColumnName'
)
Respondido 28 Abr '18, 15:04
No importa incluso si tu SELECT *
a EXISTS
, porque cuando se usa existe, realmente no selecciona todas las filas y todas las columnas, internamente solo verifica la existencia y no verifica todas las filas y columnas - Pawan Nogariya
7
Una de las soluciones más simples y comprensibles es:
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
contestado el 24 de mayo de 17 a las 08:05
7
Aquí hay un script simple que uso para administrar la adición de columnas en la base de datos:
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
En este ejemplo, el Name
es la ColumnName
para ser agregado y Object_Id
es la TableName
Respondido el 28 de enero de 18 a las 04:01
5
Haga algo si la columna no existe:
BEGIN
IF (COL_LENGTH('[dbo].[Table]', 'Column ') IS NULL)
BEGIN
//Do something
END
END;
Haga algo si la columna existe:
BEGIN
IF (COL_LENGTH('[dbo].[Table]', 'Column ') IS NOT NULL)
BEGIN
//Do something
END
END;
respondido 01 nov., 19:11
4
La siguiente consulta se puede usar para verificar si la columna buscada existe o no en la tabla. Podemos tomar una decisión basada en el resultado de la búsqueda también como se muestra a continuación.
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
Respondido 30 Oct 18, 14:10
3
Sin embargo, otra variación ...
SELECT
Count(*) AS existFlag
FROM
sys.columns
WHERE
[name] = N 'ColumnName'
AND [object_id] = OBJECT_ID(N 'TableName')
respondido 07 mar '19, 06:03
3
Otra contribución es la siguiente muestra que agrega la columna si no existe.
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
Espero eso ayude. Simone
Respondido 12 Jul 19, 00:07
3
//Only checks
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
Respondido 11 ago 20, 19:08
1
tabla -> tabla de secuencia de comandos como -> nuevas ventanas: tiene una secuencia de comandos de diseño. comprobar y encontrar el nombre de la columna en nuevas ventanas
contestado el 10 de mayo de 19 a las 16:05
1
Ejecute la siguiente consulta para verificar si la columna existe en la tabla dada:
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';
contestado el 29 de mayo de 19 a las 14:05
1
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
Respondido 08 Jul 19, 11:07
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas sql-server sql-server-2008 tsql sql-server-2012 sql-server-2016 or haz tu propia pregunta.
En realidad, no creo que haya nada de malo en el código de la pregunta: funciona muy bien para mí en 2008 R2. (¿Quizás lo estaba ejecutando en la base de datos incorrecta? ¿Quizás su base de datos distingue entre mayúsculas y minúsculas y no tenía el caso correcto en sus cadenas myTableName / myColumnName? Este tipo de consulta parece más flexible que la solución COL_LENGTH: puedo para ejecutarlo contra una base de datos diferente e incluso sobre un enlace de base de datos con el prefijo adecuado "INFORMATION_SCHEMA". No pude ver cómo hacer eso con la función de metadatos COL_LENGTH. - mwardm
@mwardm-
COL_LENGTH('AdventureWorks2012.HumanResources.Department ','ModifiedDate')
funciona bien. - Martin SmithPequeña pista relacionada: si desea actualizar una columna justo después de la adición de la columna (creo que muchos usuarios estaban buscando este artículo para ese propósito), puede usar
EXEC sp_executesql
con formadoUPDATE
declaración. - cassandradLa respuesta real es que debe agregar la base de datos con la que está comprobando para que sea
FROM [YourDatabase].INFORMATION_SCHEMA.COLUMNS
- Alex KwitnyTambién puede utilizar syscolumns y sysobjects de forma muy sencilla. - dcpking