segunda-feira, 31 de janeiro de 2011

Verificando se uma coluna existe em uma tabela (através de Views de Sistema)

As Views de Sistema são ferramentas muito úteis para recuperar informações sobre a estrutura e estatísticas de um banco de dados SQL Server.

Os scripts abaixo mostram como utilizar a view COLUMNS do Schema INFORMATION_SCHEMA para verificar se uma coluna existe. Nos exemplos, deseja-se incluir a coluna Telefone VARCHAR(15) à tabela Funcionarios a View Columns é utilizada para verificar se a coluna já pertence à tabela, evitando que o script resulte em erro (por tentativa de inserção de uma coluna duplicada).

Veja o exemplo para as versões 2005 e 2008 do SQL Server:

-- Criando tabela para teste
CREATE TABLE Funcionarios
(
    idFuncionario INT IDENTITY (1,1) PRIMARY KEY
    , nome VARCHAR(100) NOT NULL
)

-- Verificando se a coluna Telefone VARCHAR(15)
-- existe na tabela Funcionarios
IF NOT EXISTS
(
  SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS C
  WHERE
    TABLE_NAME = 'Funcionarios'
    AND TABLE_SCHEMA = 'dbo'
    AND COLUMN_NAME = 'Telefone'
    AND DATA_TYPE = 'VARCHAR'
    AND CHARACTER_MAXIMUM_LENGTH = 15
)
BEGIN

   -- Adicionando a coluna Telefone VARCHAR(15)
   -- à tabela Funcionarios
   ALTER TABLE Funcionarios
      ADD Telefone VARCHAR(15)

   PRINT 'Coluna Telefone adicionada à tabela Funcionarios'

END
ELSE
   BEGIN
     PRINT 'Coluna Telefone já existe na tabela Funcionarios'
   END

Para os que utilizam o SQL Server 2000, pode-se utilizar um conjunto de Views de Sistema (sysobjects, syscolumns e systypes) para obter resultado semelhante.Veja o exemplo abaixo:

-- Criando tabela para teste
CREATE TABLE Funcionarios
(
    idFuncionario INT IDENTITY (1,1) PRIMARY KEY
    , nome VARCHAR(100) NOT NULL
)

-- Verificando se a coluna Telefone VARCHAR(15) existe na tabela Funcionarios
IF NOT EXISTS 
(
    SELECT 1 FROM syscolumns Coluna
        INNER JOIN sysobjects    Tabela ON
             Coluna.id     = Tabela.id
        INNER JOIN systypes        Tipo ON
             Tipo.xtype = Coluna.xtype
    WHERE
            Coluna.name        = 'Telefone'
        AND Tabela.name        = 'Funcionarios'
        AND Tipo.name        = 'varchar'
        and Coluna.length    = 15
)
BEGIN
 
    -- Adicionando a coluna Telefone VARCHAR(15)
    -- à tabela Funcionarios
    ALTER TABLE Funcionarios
        ADD  Telefone VARCHAR(15)
     
    PRINT 'Coluna Telefone adicionada à tabela Funcionarios'
     
END
ELSE
    BEGIN
        PRINT 'Coluna Telefone já existe na tabela Funcionarios'
    END

Nestes exemplos, comparamos o nome, tipo de dado, e tamanho do campo para encontrar a coluna. As view de sistema disponibilizam muitas outras informações (collation, precisão decimal, etc.). Explore estas informações de acordo com a sua necessidade!

2 comentários:

Unknown disse...

Ótima dica.

Valeu

Jefferson Castro disse...

Cara você salvou meu dia!

Postar um comentário