lunedì 2 marzo 2009

Campi di una tabella .. tipo ... e chiave primaria.

Come posso ottenere tutti i campi di una tabella con l'evidenza del campo chiave?

A molti di noi sarà capitato in più di un occasione la necessità di individuare tutti i campi di una tabella, un po per creare uno statement in automatico, un po' per analisi di Db che non abbiamo disegnato noi.

Nel mio caso sto realizzando un piccolo prodotto che crea soluzioni a pacchetto partendo da un db è va tutto bene fino a che non si impatta con le Query.. e non tanto con le SELECT .. ma con le UPDATE o con le DELETE.

Mi sono quindi domandato fino a che punto spingermi nell'implementazione... arrivando alla soluzione, che
"IO PREMO UN TASTO... LUI FA' IL 90% DEL COMPITO".

Quindi torniamo a bomba sulla query , ci servono:
  1. INFORMATION_SCHEMA.COLUMNS
  2. INFORMATION_SCHEMA.TABLE_CONSTRAINTS
  3. INFORMATION_SCHEMA.KEY_COLUMN_USAGE
La prima contiene i nomi delle colonne..
la seconda contiene i nomi delle constraint..
la terza (a me sembra una estensione della seconda)

Dalla prima recuperiamo le colonne contenenti Nome e Tipo
Dalla seconda e dalla terza recuperiamo se è un identity
Ma chiaramente mettendole in Join .. ci perdiamo tutti i campi che non lo sono ..
Quindi ci basta fare una piccola Union con gli SCARTATI...

ed ecco che cosa ne viene fuori ..

select
m.column_name,
m.data_type,
x.CONSTRAINT_TYPE
from
INFORMATION_SCHEMA.COLUMNS m,
(select
CONSTRAINT_TYPE,column_name
from
INFORMATION_SCHEMA.TABLE_CONSTRAINTS a,
INFORMATION_SCHEMA.KEY_COLUMN_USAGE b
where
a.table_name = '[tbName]'
and
b.CONSTRAINT_NAME = a.CONSTRAINT_NAME) AS x
where
m.table_name = '[tbName]'
and
x.column_name = m.column_name
UNION
select
m.column_name,
m.data_type,
' '
from
INFORMATION_SCHEMA.COLUMNS m,
(select
CONSTRAINT_TYPE,column_name
from
INFORMATION_SCHEMA.TABLE_CONSTRAINTS a,
INFORMATION_SCHEMA.KEY_COLUMN_USAGE b
where
a.table_name = '[tbName]'
and
b.CONSTRAINT_NAME = a.CONSTRAINT_NAME) AS x
where
m.table_name = '[tbName]'
and
x.column_name <> m.column_name


Provare per credere...


Questà può essere eseguita come sqlCommand da un qualsiasi dataAdapter ed il contenuto può agevolmente essere messo
in una dataTable..

Bhe buon divertimento

Nessun commento: