saber - ¿Cómo comprobar si existe una columna en una tabla de SQL Server?
verificar si existe una columna en una tabla (24)
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 el ColumnName
de ColumnName
que se agregará y Object_Id
es el nombre de Object_Id
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?
Esto me funcionó en SQL 2000:
IF EXISTS
(
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = ''table_name''
AND column_name = ''column_name''
)
BEGIN
...
END
Hay varias formas de verificar la existencia de una columna. Recomiendo encarecidamente utilizar INFORMATION_SCHEMA.COLUMNS
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 verificar el system catalog.
Además, no es necesario utilizar SELECT *
, simplemente NULL value
IF EXISTS(
SELECT NULL
FROM INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = ''myTableName''
AND COLUMN_NAME = ''myColumnName''
)
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.
La consulta a continuación se puede usar para verificar si la columna buscada existe o no en la tabla. Podemos tomar decisiones basadas en el resultado buscado 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
La respuesta de Wheat es buena, pero supone que no tiene ningún par de nombre de tabla / nombre de columna idénticos en ningún esquema o base de datos. Para que sea seguro para esa condición use este ...
select *
from Information_Schema.Columns
where Table_Catalog = ''DatabaseName''
and Table_Schema = ''SchemaName''
and Table_Name = ''TableName''
and Column_Name = ''ColumnName''
Modifique lo siguiente para satisfacer 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
Edite para lidiar con edite para cuestionar : Eso debería funcionar: mire cuidadosamente su código para detectar errores estúpidos; ¿está consultando INFORMATION_SCHEMA en la misma base de datos en la que se está aplicando su inserción, por ejemplo? ¿Tiene un error tipográfico en su tabla / nombre de columna en cualquiera de las declaraciones?
Necesitaba algo similar para SQL SERVER 2000 y, como señala @Mitch, esto solo funciona en 2005+.
Si ayudara 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'')
Otra variación más ...
SELECT Count(*) AS existFlag FROM sys.columns
WHERE [name] = N''ColumnName'' AND [object_id] = OBJECT_ID(N''TableName'')
Para las personas que están verificando la existencia de la columna para soltarla.
En SQL Server 2016 puede usar nuevas declaraciones DIE en lugar de grandes envoltorios de IF
ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
Prefiero INFORMATION_SCHEMA.COLUMNS
sobre una tabla del sistema porque Microsoft no garantiza conservar las tablas del sistema entre las versiones. Por ejemplo, dbo.syscolumns
todavía funciona en SQL 2008, pero está en desuso y podría eliminarse en cualquier momento en el futuro.
Primero verifique si la combinación de table
/ column
( id
/ name
) existe en dbo.syscolumns
(una tabla interna de SQL Server que contiene definiciones de campo), y si no es así, emita la consulta ALTER TABLE
adecuada para agregarla. Por ejemplo:
IF NOT EXISTS ( SELECT *
FROM syscolumns
WHERE id = OBJECT_ID(''Client'')
AND name = ''Name'' )
ALTER TABLE Client
ADD Name VARCHAR(64) NULL
Prueba esto
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'')
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
Puede usar las vistas del sistema de esquema de información para descubrir casi todo sobre las tablas que le interesan:
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = ''yourTableName''
ORDER BY ORDINAL_POSITION
También puede consultar vistas, procedimientos almacenados y casi cualquier cosa sobre la base de datos utilizando las vistas de esquema de información.
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
Un buen amigo y colega mío me mostró cómo también se puede usar un bloque IF
con las funciones OBJECT_ID
y COLUMNPROPERTY
de SQL en SQL SERVER 2005+ para buscar una columna. Puedes 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
Una de las soluciones más sencillas 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
Una versión de la tabla temporal de la respuesta aceptada :
if (exists(select 1
from tempdb.sys.columns
where Name = ''columnName''
and Object_ID = object_id(''tempdb..#tableName'')))
begin
...
end
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 para 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 las funciones de metadatos como COL_LENGTH
siempre solo devuelven datos sobre cambios confirmados independientemente del nivel de aislamiento en vigor.
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;
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
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 exists''
end
select distinct object_name(sc.id)
from syscolumns sc,sysobjects so
where sc.name like ''%col_name%'' and so.type=''U''