Tragbare SQL, um zu bestimmen, ob eine Tabelle vorhanden ist oder nicht?
-
22-07-2019 - |
Frage
Gibt es eine portable Möglichkeit Tabelle bereits, wenn eine Datenbank zur Bestimmung existiert oder nicht?
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.