SQL portátil para determinar se uma tabela existe ou não?
-
22-07-2019 - |
Pergunta
Existe uma maneira portátil de determinar se uma tabela de banco de dados já existe ou não?
Solução
Portable? Eu não penso assim.
Talvez o mais próximo que você pode obter é:
select * from <table>
E isso iria retornar um erro se a tabela não existe.
Outras dicas
Este é tão portátil quanto ele ganha, com tristeza:
select
count(*)
from
information_schema.tables
where
table_name = 'tablename'
and table_schema = 'dbo'
Este definitivamente funciona no SQL Server, MySQL e PostgreSQL. Não tanto no Oracle, no entanto. Você teria que acessar o dicionário de dados Oracle para isso. No entanto, existe um projeto de código aberto que cria information_schema
no Oracle do dicionário de dados . Você pode tentar que se você precisar portabilidade absoluta.
P. S.-Schema não tem que ser dbo
, mas isso é o mais comum.
Eu diria
select 'x' from <table_name> where 0=1;
A desvantagem é que se você receber um erro, você não sabe ao certo qual foi a causa real. Pode estar faltando mesa ou por exemplo, um erro de conexão. Você pode analisar a mensagem de erro, mas definitivamente não seria portátil.
As exibições INFORMATION_SCHEMA são padrão ANSI - assim aqueles deve ser sua opção mais portátil. Não se esqueça de adicionar o tipo de esquema e tabela para sua cláusula where ...
if exists(select *
from information_schema.tables
where table_schema = 'dbo'
and table_name = 'MyTable'
and table_type = 'basetable')
begin
-- your code here
end
Aqui está algo que é razoavelmente portátil:
selecione agora () do limite de Tabela 1;
Ele não depende de conhecimento de qualquer coluna particular.
Ele não incorrer a sobrecarga que count (*) às vezes tem.
Não importa se a tabela está vazia ou não.
Ele falhar se a tabela não existe.
Como todos os DBMS tem seu próprio metabase, eu acho que a maneira mais "portátil" de fazer isso é usando o aplicativo chamador si. Algo como
try
execute("select top 1 * from table")
return (true)
catch
return false
Tente consultar a tabela. Se a consulta falha -. Você receber um erro, ele não existe
Isso é provavelmente tão portátil como você pode começar. O ônus de produzir o resultado, em seguida, depende do código consultando a tabela / banco de dados.
select top 1 *
from MyTable
Mantenha a consulta o mais simples possível para evitar outros possíveis erros.