2009-09-04 15 views
15

Informix iSQL hat einen Befehl "info tables;", der alle Tabellen anzeigt.
Die Syntax für die Anzeige der Felder und ihre jeweiligen Datentypen „info columns for table;Informix SQL - Alle Felder und Tabellen auflisten

Gibt es einen ähnlichen Befehl, Tabelle.Feld für alle Tabellen und alle Felder zeigt?

+0

Wenn Sie etwas anderes benötigen, erweitern oder Ihre Frage klären. –

+0

Nein, das ist genau das, was ich wollte und von der Person, die ich kannte, würde liefern! – CheeseConQueso

+2

+1 für die Arbeit mit Informix und speziell für "LEFFLER !!!! HILFE !!!!" : D Er ist großartig! :) –

Antwort

27

die bevorzugte JOIN-Notation:

SELECT TRIM(t.tabname) || '.' || TRIM(c.colname) AS table_dot_column 
    FROM "informix".systables AS t 
    JOIN "informix".syscolumns AS c ON t.tabid = c.tabid 
WHERE t.tabtype = 'T' 
    AND t.tabid >= 100 
ORDER BY t.tabname, c.colno; 

oder die altmodischen Mitmach-where-Klausel Notation:

SELECT TRIM(t.tabname) || '.' || TRIM(c.colname) AS table_dot_column 
    FROM "informix".systables AS t, "informix".syscolumns AS c 
WHERE t.tabid = c.tabid 
    AND t.tabtype = 'T' 
    AND t.tabid >= 100 
ORDER BY t.tabname, c.colno; 

Vorausgesetzt Sie haben eine ausreichend aktuelle Version von IDS verwenden, können Sie kann nach Spalten sortieren, die nicht in der Auswahlliste aufgeführt sind. Wenn Sie Beschwerden erhalten, fügen Sie die Bestellspalten zur Auswahlliste hinzu.

Das Verknüpfungskriterium ist offensichtlich; Der Tabtype = 'T' listet nur Tabellen auf, nicht Views, Synonyme und andere solche Items, die in systables aufgelistet sind. Die Tabelle> 100 zeigt nur Tabellen an, die explizit in der Datenbank erstellt wurden, nicht der Systemkatalog.

Dies beinhaltet nicht die Typinformationen - wenn Sie das wollen, müssen Sie ein bisschen mehr Arbeit erledigen. Sie finden eine Datei $INFORMIXDIR/etc/xpg4_is.sql, die eine grobe Annäherung an eine alte Version des XPG4 (X/Open Standard) Informationsschemas (daher der Dateiname) enthält. Dort gibt es Funktionen usw., um Typinformationen von syscolumns.coltype und syscolumns.collength in erkennbare Zeichenfolgen zu decodieren. Ich vermute jedoch stark, dass es weder DISTINCT-Typen noch andere benutzerdefinierte Typen behandelt. Ich bin entzückt, dass ich mich als falsch erwiesen habe, aber ... Wenn Sie die relevanten Teile dieser Datei zu Ihrer Datenbank hinzufügen, sollten Sie dann auch die Typinformationen erhalten können.

Beachten Sie auch, dass alle INFO-Befehle in ISQL und DB-Access im Frontend simuliert werden, nicht im IDS-Server. Grundsätzlich nehmen die Programme die Anfrage entgegen und wandeln sie in eine komplexere SQL-Anweisung um. Sehen Sie den Code in der Datei sqlinfo.ec, die Teil von SQLCMD ist (verfügbar von IIUG Software Archive) für wie mein SQLCMD-Programm INFO-Anweisungen behandelt. (Anmerkung: Die INFO-Ausgabe von SQLCMD ist anders formatiert als die INFO-Ausgabe von ISQL und DB-Access.)

+0

das ist, was ich brauchte ... danke nochmal – CheeseConQueso

+0

Danke für das Update nach dem Upvote Jonathan! – MattH

+0

Wenn Sie den Tabellennamen wissen möchten, wenn Sie Ihren Spaltennamen bereits kennen, können Sie dieselbe Abfrage mit where-Bedingung wie 'c.colname = 'COLUMNNAME' verwenden –

1

Verwenden Sie syscolumns-Tabelle. Solche Informationen werden in IBM Informix Guide to SQL

beschrieben

Ich habe einfache Python-Dienstprogramme getan, die Schema-Infos für Informix, Oracle und PostgreSQL zeigt. Sie sind nützlich, wenn Sie Datenbanken vergleichen müssen.

1

Wie Jonathan Leffers Antwort erwähnt, wird eine vollständige Behandlung von Spaltentypen und Spaltendetails kompliziert, wie in der die SYSCOLUMNS Dokumentation. Aber wenn Sie auf Datenbank suchen nicht kompliziertere Typen verwenden, dies zusätzlich zu seinem Skript wird den Grundtyp zeigen und ob NULL-Werte sind zulässig:

SELECT TRIM(t.tabname) || '.' || TRIM(c.colname) AS table_dot_column, 
CASE 
    WHEN MOD(coltype,256)=0 THEN 'CHAR' 
    WHEN MOD(coltype,256)=1 THEN 'SMALLINT' 
    WHEN MOD(coltype,256)=2 THEN 'INTEGER' 
    WHEN MOD(coltype,256)=3 THEN 'FLOAT' 
    WHEN MOD(coltype,256)=4 THEN 'SMALLFLOAT' 
    WHEN MOD(coltype,256)=5 THEN 'DECIMAL' 
    WHEN MOD(coltype,256)=6 THEN 'SERIAL' 
    WHEN MOD(coltype,256)=7 THEN 'DATE' 
    WHEN MOD(coltype,256)=8 THEN 'MONEY' 
    WHEN MOD(coltype,256)=9 THEN 'NULL' 
    WHEN MOD(coltype,256)=10 THEN 'DATETIME' 
    WHEN MOD(coltype,256)=11 THEN 'BYTE' 
    WHEN MOD(coltype,256)=12 THEN 'TEXT' 
    WHEN MOD(coltype,256)=13 THEN 'VARCHAR' 
    WHEN MOD(coltype,256)=14 THEN 'INTERVAL' 
    WHEN MOD(coltype,256)=15 THEN 'NCHAR' 
    WHEN MOD(coltype,256)=16 THEN 'NVARCHAR' 
    WHEN MOD(coltype,256)=17 THEN 'INT8' 
    WHEN MOD(coltype,256)=18 THEN 'SERIAL8' 
    WHEN MOD(coltype,256)=19 THEN 'SET' 
    WHEN MOD(coltype,256)=20 THEN 'MULTISET' 
    WHEN MOD(coltype,256)=21 THEN 'LIST' 
    WHEN MOD(coltype,256)=22 THEN 'ROW (unnamed)' 
    WHEN MOD(coltype,256)=23 THEN 'COLLECTION' 
    WHEN MOD(coltype,256)=40 THEN 'LVARCHAR fixed-length opaque types' 
    WHEN MOD(coltype,256)=41 THEN 'BLOB, BOOLEAN, CLOB variable-length opaque types' 
    WHEN MOD(coltype,256)=43 THEN 'LVARCHAR (client-side only)' 
    WHEN MOD(coltype,256)=45 THEN 'BOOLEAN' 
    WHEN MOD(coltype,256)=52 THEN 'BIGINT' 
    WHEN MOD(coltype,256)=53 THEN 'BIGSERIAL' 
    WHEN MOD(coltype,256)=2061 THEN 'IDSSECURITYLABEL' 
    WHEN MOD(coltype,256)=4118 THEN 'ROW (named)' 
    ELSE TO_CHAR(coltype) 
END AS Type, 
BITAND(coltype,256)=256 AS NotNull 
    FROM "informix".systables AS t 
    JOIN "informix".syscolumns AS c ON t.tabid = c.tabid 
WHERE t.tabtype = 'T' 
    AND t.tabid >= 100 
ORDER BY t.tabname, c.colno;