Eu gostaria que essa fosse a discussão final sobre como verificar se existe uma tabela no SQL Server 2000/2005 usando instruções SQL.
Quando você busca no Google a resposta, recebe muitas respostas diferentes. Existe uma maneira oficial / compatível com versões anteriores e posteriores?
Aqui estão duas maneiras possíveis de fazer isso. Qual das duas é a melhor / melhor maneira de fazê-lo?
Primeira maneira:
IF EXISTS (SELECT 1
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE='BASE TABLE'
AND TABLE_NAME='mytablename')
SELECT 1 AS res ELSE SELECT 0 AS res;
Segunda maneira:
IF OBJECT_ID (N'mytablename', N'U') IS NOT NULL
SELECT 1 AS res ELSE SELECT 0 AS res;
MySQL fornece o simples
SHOW TABLES LIKE '%tablename%';
declaração. Eu estou procurando algo semelhante.
Respostas:
Para consultas como essa, é sempre melhor usar uma
INFORMATION_SCHEMA
exibição. Essas visualizações são (principalmente) padrão em muitos bancos de dados diferentes e raramente mudam de versão para versão.Para verificar se existe uma tabela, use:
fonte
SELECT * FROM tempdb.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'TheSchema' AND TABLE_NAME LIKE '#TheTable%'
Observe também que, se por algum motivo você precisar verificar uma tabela temporária, poderá fazer isso:
fonte
Sempre usamos o
OBJECT_ID
estilo desde que me lembrofonte
OBJECT_ID('TableName', 'U')
para garantir que o objeto seja uma tabela.IF EXISTS
consulta a partir da resposta aceita repetidamente. Além disso, tudo é enigmático até você ler a documentação, especialmente em T-SQL (ou qualquer outra variante, na verdade).Por favor, veja as abordagens abaixo,
Abordagem 1: Usando a visualização INFORMATION_SCHEMA.TABLES
Podemos escrever uma consulta como abaixo para verificar se existe uma tabela Customers no banco de dados atual.
Abordagem 2: Usando a função OBJECT_ID ()
Podemos usar a função OBJECT_ID () como abaixo para verificar se existe uma tabela de clientes no banco de dados atual.
Abordagem 3: Usando sys.Objects Catalog View
Podemos usar a exibição do catálogo Sys.Objects para verificar a existência da tabela, como mostrado abaixo:
Abordagem 4: Usando o sys.Tables Catalog View
Podemos usar a exibição do catálogo Sys.Tables para verificar a existência da tabela, como mostrado abaixo:
Abordagem 5: Evite usar a tabela do sistema sys.sysobjects
Devemos evitar o uso direto da tabela de sistema sys.sysobjects, pois o acesso direto a ela será preterido em algumas versões futuras do Sql Server. Conforme o link BOL da Microsoft, a Microsoft está sugerindo o uso das exibições de catálogo sys.objects / sys.tables em vez da tabela do sistema sys.sysobjects diretamente.
consultado em: http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/
fonte
Procurando uma tabela em um banco de dados diferente:
fonte
Só queria mencionar uma situação em que provavelmente seria um pouco mais fácil usar o
OBJECT_ID
método. AsINFORMATION_SCHEMA
visualizações são objetos em cada banco de dados -https://msdn.microsoft.com/en-us/library/ms186778.aspx
Portanto, todas as tabelas que você acessa usando
refletirá apenas o que está dentro
[database]
. Se você quiser verificar se existem tabelas em outro banco de dados, sem alterar dinamicamente a[database]
cada vez,OBJECT_ID
permitirá que você faça isso imediatamente. Ex-funciona tão bem quanto
Edição do SQL SERVER 2016 :
A partir de 2016, a Microsoft simplificou a capacidade de verificar objetos inexistentes antes da remoção, adicionando as
if exists
palavras-chave àsdrop
instruções. Por exemplo,fará o mesmo que
OBJECT_ID
/INFORMATION_SCHEMA
wrappers, em 1 linha de código.https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/
fonte
fonte
O uso do Esquema de Informação é a maneira padrão do SQL, por isso deve ser usado por todos os bancos de dados que o suportam.
fonte
Aqui no código acima, o nome da tabela é
Mapping_APCToFANavigator
.fonte
{ }
) na barra de ferramentas do editor de bem formato e sintaxe destacá-lo!Se você precisar trabalhar em bancos de dados diferentes:
fonte
Sei que é uma pergunta antiga, mas encontrei essa possibilidade se você planeja chamá-la com frequência.
fonte
sysname
tipo de dadosvarchar(50)
. Não deve usar asysobjects
exibição obsoleta e não leva em conta o esquema.Você pode usar o código abaixo
Ou
fonte
Apenas adicionando aqui, para o benefício de desenvolvedores e colegas DBAs
um script que recebe @Tablename como parâmetro
(que pode ou não conter o nome do esquema) e retorna as informações abaixo se a tabela de esquema existir:
Eu produzi esse script para ser usado dentro de outros scripts toda vez que preciso testar se uma tabela ou exibição existe ou não e, quando existir, faça com que seu object_id seja usado para outros fins.
Isso gera um erro quando você passa uma string vazia, nome de esquema errado ou nome de tabela incorreto.
isso pode estar dentro de um procedimento e retornar -1 por exemplo.
Como exemplo, eu tenho uma tabela chamada "Facts.FactBackOrder" em um dos meus bancos de dados do Data Warehouse.
Foi assim que consegui isso:
fonte
dbo.[hello.world ]
e o script não a encontraria por vários motivos. Dito isto, é improvável que alguém queira criar essa tabela, mas ainda assim. De qualquer forma, suaTHE_NAME
coluna é definida comosysname', yet you try to squeeze 2
colunas sysname` e um ponto (.
), todos envoltos entre colchetes ali ... aquele está fadado a falhar algum dia!No SQL Server 2000, você pode tentar:
fonte
fonte
Algo importante a saber para quem ainda não encontrou sua solução: SQL server! = MYSQL . Se você quiser fazer isso com o MYSQL , é bastante simples
Postando isso aqui porque é o principal sucesso no Google.
fonte
fonte
Você pode usar isto:
fonte
fonte
- - cria procedimento para verificar se existe uma tabela
- - como usar: verifique se existem migrações de tabela
fonte
fonte
Estou tomando aqui criando uma visão como exemplo .
Como os comandos ALTER / CREATE não podem estar dentro dos blocos BEGIN / END. Você precisa testar a existência e descartá-la antes de criar
Se você está preocupado com a perda de permissões, é possível criar um script para as instruções GRANT e executá-las novamente no final.
Você pode agrupar a criação / alteração em uma string e executar um EXEC - que pode ficar feio para visualizações grandes
fonte
Se alguém estiver tentando fazer a mesma coisa no linq to sql (ou especialmente no linqpad), ative a opção para incluir tabelas e visualizações do sistema e faça este código:
dado que você tem um objeto com o nome em uma propriedade chamada item e o esquema em uma propriedade chamada schema em que o nome da variável de origem é
a
fonte
Se essa for a discussão 'definitiva', deve-se notar que o script de Larry Leonard pode consultar um servidor remoto e também se os servidores estão vinculados.
fonte
Eu tive alguns problemas com a seleção de INFORMATIONAL_SCHEME e OBJECT_ID. Não sei se é um problema do driver ODBC ou algo assim. As consultas do SQL Management Studio, ambas, foram boas.
Aqui está a solução:
Portanto, se a consulta falhar, provavelmente não existe uma tabela no banco de dados (ou você não tem permissões de acesso).
A verificação é feita comparando o valor (número inteiro no meu caso) retornado pelo executor SQL que lida com o driver ODBC.
fonte
Há mais uma opção para verificar se a tabela existe nos bancos de dados
fonte
Execute esta consulta para verificar se a tabela existe no banco de dados:
fonte
considere em um banco de dados que você tem uma tabela t1. você deseja executar o script em outro banco de dados como - se t1 existir, não faça mais nada criar t1. Para fazer isso, abra o visual studio e faça o seguinte:
Clique com o botão direito do mouse em t1, depois em Tabela de scripts como, em DROP e Create To, em seguida, Novo Query Editor
você encontrará sua consulta desejada. Mas antes de executar esse script, não se esqueça de comentar a instrução drop na consulta, pois você não deseja criar uma nova, se já houver uma.
obrigado
fonte