2009-08-04 11 views
5

Existe-t-il un moyen portable de déterminer si une table de base de données existe déjà ou non?Portable SQL pour déterminer si une table existe ou non?

+0

plus portable: _select * de YourTable_, si vous obtenez une erreur alors elle n'existe pas, si vous n'obtenez pas d'erreur, elle existe. ;-) –

Répondre

4

Portable? Je ne pense pas.

Peut-être le plus proche, vous pouvez obtenir est:

select * from <table> 

et ceci renvoie une erreur si la table n'existe pas.

+0

Aye Alan, c'est la conclusion à laquelle je suis parvenu. Boiteux! – jkp

4

C'est aussi portable qu'il obtient, malheureusement:

select 
    count(*) 
from 
    information_schema.tables 
where 
    table_name = 'tablename' 
    and table_schema = 'dbo' 

Cela fonctionne vraiment sur SQL Server, MySQL et Postgres. Pas tellement sur Oracle, cependant. Vous devriez accéder au dictionnaire de données Oracle pour cela. Toutefois, il existe un projet open source creates information_schema in Oracle à partir du dictionnaire de données. Vous pouvez essayer cela si vous avez besoin d'une portabilité absolue.

P.S.-Schema ne doit pas être dbo, mais c'est le plus commun.

+0

ne pas oublier de vérifier le schéma aussi. dbo.tablename et MySchema.tablename peuvent tous deux exister. –

0

Comme chaque SGBD a sa propre métabase, je pense que la façon la plus «portable» de faire cela est d'utiliser l'appelant lui-même. Quelque chose comme

try 
    execute("select top 1 * from table") 
    return (true) 
catch 
    return false 
+2

Je ne suis pas sûr que 'top' soit portable. – jkp

+0

bien, si même le top 1 n'est pas assez portable, utilisez simplement select * – Rodrigo

+0

'try .. catch' n'est certainement pas portable –

0

Tentative d'interrogation de la table. Si la requête échoue - vous obtenez une erreur, elle n'existe pas.

C'est probablement aussi portable que possible. La charge de produire le résultat dépend alors du code interrogeant la table/base de données. Conserver la requête aussi simple que possible pour éviter d'autres erreurs possibles.

select top 1 * 
from MyTable 

1

Les vues INFORMATION_SCHEMA sont conformes à la norme ANSI. Elles devraient donc être votre option la plus portable. Ne pas oublier d'ajouter le schéma et le type table à votre clause 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 
1

Voici quelque chose qui est raisonnablement portable:

sélectionnez maintenant() à partir de 1 TABLE limite;

Il ne dépend pas de la connaissance d'une colonne particulière.

Il n'entraîne pas les frais généraux que le compte (*) a parfois.

Peu importe que la table soit vide ou non.

Échec si la table n'existe pas.

+0

Ne fonctionne pas avec SQLServer – Toto

+0

' now() 'n'est pas" portable ". 'current_timestamp' serait –

2

Je dirais

select 'x' from <table_name> where 0=1;

L'inconvénient est que si vous obtenez une erreur, vous ne savez pas exactement ce qui était la cause réelle. Il peut manquer un tableau ou par ex. une erreur de connexion. Vous pouvez analyser le message d'erreur, mais certainement ce ne serait pas portable.

Questions connexes