Como verificar se uma coluna existe em uma tabela do SQL Server?
-
02-07-2019 - |
Pergunta
Eu preciso adicionar uma coluna específica se ele não existe. Eu tenho algo como o seguinte, mas sempre retorna false:
IF EXISTS(SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'myTableName'
AND COLUMN_NAME = 'myColumnName')
Como posso verificar se uma coluna existe em uma tabela do banco de dados SQL Server?
Solução
SQL Server 2005 em diante:
IF EXISTS(SELECT 1 FROM sys.columns
WHERE Name = N'columnName'
AND Object_ID = Object_ID(N'schemaName.tableName'))
BEGIN
-- Column Exists
END
A versão de Martin Smith é mais curto:
IF COL_LENGTH('schemaName.tableName', 'columnName') IS NOT NULL
BEGIN
-- Column Exists
END
Outras dicas
A versão mais 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
O ponto sobre permissões em metadados visualização aplica-se a todas as respostas não apenas este.
Note que o primeiro parâmetro nome da tabela para COL_LENGTH
pode estar em um, dois, ou três formato de nome da peça, conforme necessário.
Um exemplo fazendo referência a uma tabela em um banco de dados diferente é
COL_LENGTH('AdventureWorks2012.HumanResources.Department','ModifiedDate')
Uma diferença com esta resposta em relação ao uso dos pontos de vista de metadados é que as funções de metadados, como COL_LENGTH
sempre retornar apenas dados sobre alterações confirmadas independentemente do nível de isolamento em vigor.
Tweak a seguir para atender às suas necessidades específicas:
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 lidar com edição em questão : Isso deve funcionar - ter um olhar atento sobre o seu código para erros estúpidos; você está consultando INFORMATION_SCHEMA no mesmo banco de dados como a sua inserção está sendo aplicada, por exemplo? Você tem um erro de digitação em seu nome de tabela / coluna em qualquer declaração?
Tente isto ...
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
Eu prefiro INFORMATION_SCHEMA.COLUMNS
sobre uma tabela de sistema porque a Microsoft não garante a preservar as tabelas do sistema entre as versões. Por exemplo, dbo.syscolumns
ainda funciona no SQL 2008, mas está obsoleto e pode ser removido a qualquer momento no futuro.
Você pode usar as exibições do sistema esquema de informações para descobrir praticamente qualquer coisa sobre as tabelas que você está interessado em:
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'yourTableName'
ORDER BY ORDINAL_POSITION
Você pode vistas também interrogar, procedimentos e praticamente nada sobre o banco de dados usando as vistas INFORMATION_SCHEMA armazenado.
Primeiro, verifique se a combinação table
/ column
(id
/ name
) existe em dbo.syscolumns
(uma tabela do SQL Server interna que contém definições de campo), e se não emitir a consulta ALTER TABLE
apropriado para adicioná-lo. Por exemplo:
IF NOT EXISTS ( SELECT *
FROM syscolumns
WHERE id = OBJECT_ID('Client')
AND name = 'Name' )
ALTER TABLE Client
ADD Name VARCHAR(64) NULL
Para as pessoas que está verificando a existência da coluna para soltá-lo.
Em SQL Server 2016 você pode usar novas declarações DIE em vez de grandes invólucros IF
ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
Tente 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
Em seguida, usá-lo como este:
IF ColumnExists('xxx', 'yyyy') = 'F'
BEGIN
ALTER TABLE xxx
ADD yyyyy varChar(10) NOT NULL
END
GO
Ele deve funcionar no SQL Server 2000 e SQL Server 2005. Não tenho certeza sobre o SQL Server 2008, mas não vejo por que não.
Um bom amigo e colega meu me mostrou como você também pode usar um bloco IF
com SQL funções OBJECT_ID
e COLUMNPROPERTY
no SQL Server 2005 + para verificar se há uma coluna. Você pode usar algo semelhante ao seguinte:
Você pode ver por si mesmo aqui
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
Isso funcionou para mim no SQL 2000:
IF EXISTS
(
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'table_name'
AND column_name = 'column_name'
)
BEGIN
...
END
Tente este
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')
Eu precisava semelhante para SQL Server 2000 e, como @ Mitch aponta, isso só funciona INM 2005 +.
Deve ajuda ninguém, isso é o que funcionou para mim no final:
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'
A versão tabela temporária do aceita resposta :
if (exists(select 1
from tempdb.sys.columns
where Name = 'columnName'
and Object_ID = object_id('tempdb..#tableName')))
begin
...
end
A resposta de trigo é bom, mas assume que você não tem nenhum pares nome de nome de tabela / coluna idênticos em qualquer esquema ou banco de dados. Para torná-la segura para essa condição utilizar este ...
select *
from Information_Schema.Columns
where Table_Catalog = 'DatabaseName'
and Table_Schema = 'SchemaName'
and Table_Name = 'TableName'
and Column_Name = 'ColumnName'
Existem várias maneiras de verificar a existência de uma coluna.
Eu fortemente recomendo usar INFORMATION_SCHEMA.COLUMNS
como ele é criado, a fim de se comunicar com o usuário.
Considere seguintes tabelas:
sys.objects
sys.columns
e até mesmo alguns outros métodos de acesso disponíveis para verificar system catalog.
Além disso, não há necessidade de uso SELECT *
, simplesmente testá-lo por NULL value
IF EXISTS(
SELECT NULL
FROM INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = 'myTableName'
AND COLUMN_NAME = 'myColumnName'
)
Um dos mais simples e compreensível solução é:
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
Aqui está um script simples que eu uso para gerenciar adição de colunas no banco de dados:
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
Neste exemplo, o Name
é o ColumnName
para ser adicionado e Object_Id
é o TableName
Abaixo consulta pode ser usado para verificar se procurou coluna existe ou não na tabela. Podemos tomar decisão com base na procurou resultado também como mostrado abaixo.
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
Ainda outra variação ...
SELECT
Count(*) AS existFlag
FROM
sys.columns
WHERE
[name] = N 'ColumnName'
AND [object_id] = OBJECT_ID(N 'TableName')
tabela -> tabela de script como -> novas janelas - você tem roteiro design. verificar e encontrar o nome de coluna em novas janelas
Execute o abaixo consulta para verificar se a coluna existe na tabela 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';
IF EXISTS(SELECT 1 FROM sys.columns
WHERE Name = N'columnName'
AND Object_ID = Object_ID(N'schemaName.tableName'))
Esta deve ser a maneira bastante fácil e solução para a frente a este problema. Eu tenho usado isso várias vezes para cenários semelhantes. Ele funciona como um encanto, há dúvidas sobre isso.
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