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:
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:
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!
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
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
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:
Ótima dica.
Valeu
Cara você salvou meu dia!
Postar um comentário