Frage

Gibt es eine portable Möglichkeit Tabelle bereits, wenn eine Datenbank zur Bestimmung existiert oder nicht?

War es hilfreich?

Lösung

Tragbare? Ich glaube nicht.

Vielleicht können die nächst Sie bekommen, ist:

select * from <table>

Und dies würde einen Fehler zurück, wenn die Tabelle nicht existiert.

Andere Tipps

Das ist so portabel wie es wird, traurig:

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

Dies funktioniert auf jeden Fall auf SQL Server, MySQL und Postgres. Nicht so sehr auf Oracle, though. Sie würden die Oracle-Datenverzeichnis für das Zugriff müssen. Allerdings gibt es ein Open-Source-Projekt, die information_schema in Oracle aus dem Data Dictionary erstellt . Sie können versuchen, dass, wenn Sie absolute Portabilität benötigen.

P. S.-Schema muss nicht dbo werden, aber das ist die häufigste.

Ich würde sagen,

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

Der Nachteil ist, dass, wenn Sie eine Fehlermeldung erhalten, Sie wissen nicht genau, was die eigentliche Ursache war. Man könnte fehlende Tabelle oder z.B. ein Verbindungsfehler. Sie können die Fehlermeldung, analysieren, aber auf jeden Fall wäre es nicht tragbar sein.

Die INFORMATION_SCHEMA Ansichten sind ANSI-Standard - so diese sollte Ihre meisten tragbare Option sein. Vergessen Sie nicht, das Schema und Tabellentyp auf Ihre where-Klausel hinzuzufügen ...

if exists(select  *
          from    information_schema.tables
          where   table_schema = 'dbo'
                  and table_name = 'MyTable'
                  and table_type = 'basetable')
begin
     -- your code here
end

Hier ist etwas, das einigermaßen tragbar ist:

  

Wählen Sie nun () aus der Tabelle Grenze 1;

Es ist nicht auf Wissen angewiesen ist von einer bestimmten Spalte.

Es entsteht nicht den Overhead, der (*) manchmal zählen hat.

Es spielt keine Rolle, ob die Tabelle leer ist oder nicht.

Es schlägt fehl, wenn die Tabelle nicht existiert.

Wie jedes DBMS seine eigene Metabasis hat, ich glaube, der meist „portable“ Weg, dies zu tun, ist mit der Anwendung Anrufer selbst. So etwas wie

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

Versuchen Sie, die Tabelle abzufragen. Wenn die Abfrage fehlschlägt -. Eine Fehlermeldung angezeigt, existiert es nicht

Das ist wohl so portabel wie Sie bekommen können. Die Last des das Ergebnis produzieren hängt dann von dem Code in die Tabelle / Datenbank abgefragt wird.

select top 1 *
from MyTable

Halten Sie die Abfrage so einfach wie möglich andere mögliche Fehler zu vermeiden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top