2009-09-04 8 views
15

Informix iSQL ha un comando "info tables;" che mostra tutte le tabelle.
La sintassi per la visualizzazione dei campi e dei loro rispettivi tipi di dati è "info columns for table;"Informix SQL - Elenca tutti i campi e le tabelle

Esiste un comando simile che mostra table.field per tutte le tabelle e tutti i campi?

+0

Se avete bisogno di qualcosa di diverso, espandere o chiarire la tua domanda. –

+0

No, questo è esattamente quello che volevo e dalla persona che conoscevo avrebbe consegnato! – CheeseConQueso

+2

+1 per lavorare con Informix e soprattutto per "LEFFLER !!!! HELP !!!!" : D È fantastico! :) –

risposta

27

Utilizzando il preferito JOIN notazione:

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; 

o il vecchio stile di notazione join-in-cui-clausola:

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; 

Supponendo che si sta utilizzando una versione sufficientemente recente di IDS, è può ordinare per colonne non citate nell'elenco di selezione. Se ricevi reclami, aggiungi le colonne per l'ordine all'elenco di selezione.

Il criterio di unione è ovvio; il tabtype = 'T' elenca solo tabelle, non visualizzazioni, sinonimi e altri elementi elencati in systables; il tabid> = 100 elenca solo le tabelle create esplicitamente nel database, non il catalogo di sistema.

Questo non include le informazioni sul tipo: se lo vuoi, devi fare un po 'più di lavoro. Troverete un file $INFORMIXDIR/etc/xpg4_is.sql che contiene un'approssimazione approssimativa a una vecchia versione dello schema di informazioni XPG4 (standard X/Open) (da cui il nome del file). Qui ci sono funzioni ecc per decodificare le informazioni sul tipo da syscolumns.coltype e syscolumns.collength in stringhe riconoscibili. Tuttavia, sospetto fortemente che non gestisca i tipi DISTINCT, né altri tipi definiti dall'utente. Sarò felice di essere smentito, ma ... Se aggiungi le parti rilevanti di quel file al tuo database, dovresti essere in grado di ottenere anche le informazioni sul tipo.

Si noti inoltre che tutti i comandi INFO in ISQL e DB-Access sono simulati nel front-end, non eseguiti nel server IDS. Fondamentalmente, i programmi accettano la richiesta e la convertono in un'istruzione SQL più complessa. Vedere il codice nel file sqlinfo.ec che fa parte di SQLCMD (disponibile da IIUG Software Archive) per come il mio programma SQLCMD gestisce le istruzioni INFO. (Nota: l'output INFO di SQLCMD è formattato in modo diverso dall'uscita INFO di ISQL e DB-Access.)

+0

questo è quello che mi serviva ... grazie ancora – CheeseConQueso

+0

Grazie per l'aggiornamento dopo l'upvote di Jonathan! – MattH

+0

Se si desidera conoscere il nome della tabella quando si conosce già il nome della colonna, è possibile utilizzare la stessa query con la condizione where 'c.colname = 'COLUMNNAME'' –

1

Come la risposta di Jonathan Leffer menziona, una gestione completa dei tipi di colonna e dei dettagli delle colonne si complica come si può vedere nel la documentazione SYSCOLUMNS. Ma se siete alla ricerca di database non utilizzando i tipi più complicati, questa aggiunta alla sua sceneggiatura mostrerà il tipo di base e se i NULL sono consentiti:

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;