2009-08-04 7 views

Antwort

4

Tragbare? Ich denke nicht.

Vielleicht ist die nächstgelegene Sie erhalten können, ist:

select * from <table> 

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

+0

Aye Alan, das ist der Schluss, zu dem ich gekommen bin. Lame! – jkp

4

Dies ist so portabel wie es nur geht, leider:

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. Sie müssten dafür auf das Oracle Data Dictionary zugreifen. Es gibt jedoch ein Open-Source-Projekt, das creates information_schema in Oracle aus dem Data Dictionary. Sie können das versuchen, wenn Sie absolute Portabilität benötigen.

P.S.-Schema muss nicht dbo sein, aber das ist am häufigsten.

+0

vergiss nicht, auch nach dem Schema zu suchen. dbo.tablename und MySchema.tablename könnten beide existieren. –

0

Da jedes DBMS eine eigene Metabasis hat, denke ich, dass die "portabelste" Methode die Verwendung des Anwendungsaufrufers selbst ist. Etwas wie

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

Ich bin mir nicht sicher, ob "top" tragbar ist. – jkp

+0

Nun, wenn auch Top 1 ist nicht absolut portabel genug, verwenden Sie einfach wählen * – Rodrigo

+0

'versuchen .. catch' ist definitiv nicht portable –

0

Versuch, die Tabelle abzufragen. Wenn die Abfrage fehlschlägt - Sie erhalten einen Fehler, der nicht existiert.

Das ist wahrscheinlich so portabel wie Sie bekommen können. Die Last, das Ergebnis zu erzeugen, hängt dann von dem Code ab, der die Tabelle/Datenbank abfragt.

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

1

Die INFORMATION_SCHEMA-Ansichten sind ANSI-Standard - diese sollten also Ihre tragbarste 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 
1

Hier ist etwas, das einigermaßen tragbar ist:

wählen now() aus der Tabelle Grenze 1;

Es beruht nicht auf Wissen einer bestimmten Spalte.

Es entsteht nicht der Overhead, den count (*) manchmal hat.

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

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

+0

Funktioniert nicht mit SQLServer – Toto

+0

' now() 'ist nicht" tragbar ". 'current_timestamp' wäre –

2

würde ich

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

Der Nachteil ist, sagen, dass, wenn Sie eine Fehlermeldung erhalten, können Sie sicher wissen nicht, was die eigentliche Ursache war. Es könnte Tabelle fehlen oder z.B. ein Verbindungsfehler Sie können die Fehlermeldung analysieren, aber definitiv nicht tragbar.

Verwandte Themen