sql-server - tabelas - verificar se uma coluna existe mysql
Como verificar se existe uma coluna em uma tabela do SQL Server? (16)
A resposta de Wheat é boa, mas assume que você não possui pares de nomes de colunas / nomes de tabela idênticos em nenhum esquema ou banco de dados. Para torná-lo seguro para essa condição use isso ...
select *
from Information_Schema.Columns
where Table_Catalog = 'DatabaseName'
and Table_Schema = 'SchemaName'
and Table_Name = 'TableName'
and Column_Name = 'ColumnName'
Eu preciso adicionar uma coluna específica, se ela não existir. Eu tenho algo parecido com o seguinte, mas sempre retorna falso:
IF EXISTS(SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'myTableName'
AND COLUMN_NAME = 'myColumnName')
Como posso verificar se existe uma coluna em uma tabela do banco de dados do SQL Server?
Abaixo da consulta pode ser usado para verificar se a coluna pesquisada existe ou não na tabela. Podemos tomar decisões com base no resultado pesquisado, 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
Ajuste o abaixo 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
Edite para lidar com a edição para a pergunta : Isso deve funcionar - dê uma olhada cuidadosa no seu código para erros estúpidos; você está consultando o INFORMATION_SCHEMA no mesmo banco de dados em que 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?
Aqui está um script simples que uso para gerenciar a 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
a ser adicionado e Object_Id
é o TableName
Eu prefiro INFORMATION_SCHEMA.COLUMNS
em uma tabela do sistema porque a Microsoft não garante a preservação das tabelas do sistema entre as versões. Por exemplo, o dbo.syscolumns
ainda funciona no SQL 2008, mas está obsoleto e pode ser removido a qualquer momento no futuro.
Existem várias maneiras de verificar a existência de uma coluna. Eu recomendaria fortemente usar INFORMATION_SCHEMA.COLUMNS
como ele é criado para se comunicar com o usuário. Considere as seguintes tabelas:
sys.objects
sys.columns
e até mesmo alguns outros métodos de acesso disponíveis para verificar o system catalog.
Além disso, não é necessário usar o SELECT *
, basta testá-lo pelo NULL value
IF EXISTS(
SELECT NULL
FROM INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = 'myTableName'
AND COLUMN_NAME = 'myColumnName'
)
Para as pessoas que estão verificando a existência da coluna para soltá-lo.
No SQL Server 2016, você pode usar novas instruções DIE em vez de grandes wrappers IF
ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
Primeiro verifique se a combinação de table
/ column
( id
/ name
) existe em dbo.syscolumns
(uma tabela interna do SQL Server que contém definições de campos) e, se não emitir a consulta ALTER TABLE
apropriada para adicioná-la. Por exemplo:
IF NOT EXISTS ( SELECT *
FROM syscolumns
WHERE id = OBJECT_ID('Client')
AND name = 'Name' )
ALTER TABLE Client
ADD Name VARCHAR(64) NULL
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
Então use-o assim:
IF ColumnExists('xxx', 'yyyy') = 'F'
BEGIN
ALTER TABLE xxx
ADD yyyyy varChar(10) NOT NULL
END
GO
Ele deve funcionar tanto no SQL Server 2000 quanto no SQL Server 2005. Não tenho certeza sobre o SQL Server 2008, mas não vejo por que não.
Tente isso ...
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
Um bom amigo e colega meu me mostrou como você também pode usar um bloco IF
com as funções SQL OBJECT_ID
e COLUMNPROPERTY
no SQL SERVER 2005+ para verificar 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
Uma das soluções mais simples e compreensível é:
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
Uma 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 na visualização de metadados se aplica a todas as respostas, não apenas a essa.
Observe que o primeiro nome da tabela de parâmetros para COL_LENGTH
pode estar no formato de nome de uma, duas ou três partes, conforme necessário.
Um exemplo que faz referência a uma tabela em um banco de dados diferente é
COL_LENGTH('AdventureWorks2012.HumanResources.Department','ModifiedDate')
Uma diferença com essa resposta, em comparação com o uso das exibições de metadados, é que as funções de metadados, como COL_LENGTH
sempre retornam apenas dados sobre alterações confirmadas, independentemente do nível de isolamento em vigor.
Você pode usar as visualizações do sistema de esquema de informações para descobrir praticamente qualquer coisa sobre as tabelas nas quais está interessado:
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'yourTableName'
ORDER BY ORDINAL_POSITION
Você também pode interrogar modos de exibição, procedimentos armazenados e praticamente qualquer coisa sobre o banco de dados usando as exibições Information_schema.
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'
+' ['[email protected]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