Domanda

Attualmente sto usando ...

select Table_Name, Column_name, data_type, is_Nullable
from information_Schema.Columns

... per determinare le informazioni sulle colonne in un determinato database ai fini della generazione di un livello DataAccess.

Da dove posso recuperare informazioni se queste colonne sono partecipanti alla chiave primaria della loro tabella?

È stato utile?

Soluzione

Ecco un modo (sostituisci 'keycol' con il nome della colonna che stai cercando per):

SELECT  K.TABLE_NAME ,
    K.COLUMN_NAME ,
    K.CONSTRAINT_NAME
FROM    INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS C
        JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS K ON C.TABLE_NAME = K.TABLE_NAME
                                                         AND C.CONSTRAINT_CATALOG = K.CONSTRAINT_CATALOG
                                                         AND C.CONSTRAINT_SCHEMA = K.CONSTRAINT_SCHEMA
                                                         AND C.CONSTRAINT_NAME = K.CONSTRAINT_NAME
WHERE   C.CONSTRAINT_TYPE = 'PRIMARY KEY'
        AND K.COLUMN_NAME = 'keycol';

Altri suggerimenti

Allo stesso modo, quanto segue ti fornirà informazioni su tutte le tabelle e le relative chiavi, anziché informazioni su colonne specifiche. In questo modo, ti assicuri di avere tutte le colonne di interesse e di sapere a cosa partecipano. Per vedere tutte le chiavi (primaria, straniera, unica), commenta la clausola WHERE.

SELECT K.TABLE_NAME, C.CONSTRAINT_TYPE, K.COLUMN_NAME, K.CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS C
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS K
ON C.TABLE_NAME = K.TABLE_NAME
AND C.CONSTRAINT_CATALOG = K.CONSTRAINT_CATALOG
AND C.CONSTRAINT_SCHEMA = K.CONSTRAINT_SCHEMA
AND C.CONSTRAINT_NAME = K.CONSTRAINT_NAME
WHERE C.CONSTRAINT_TYPE = 'PRIMARY KEY'
ORDER BY K.TABLE_NAME, C.CONSTRAINT_TYPE, K.CONSTRAINT_NAME

Per le tue necessità, unisciti completamente esterno con INFORMATION_SCHEMA.COLUMNS e INFORMATION_SCHEMA.KEY_COLUMN_USAGE. All'istruzione select, aggiungi la colonna CONSTRAINT_NAME da INFORMATION_SCHEMA.KEY_COLUMN_USAGE che ti darà null o keyname.

select C.Table_Name, C.Column_name, data_type, is_Nullable, U.CONSTRAINT_NAME
from information_Schema.Columns C FULL OUTER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE U ON C.COLUMN_NAME = U.COLUMN_NAME
WHERE C.TABLE_NAME=@TABLENAME

questa colonna di ritorno della query con è chiave primaria.

SELECT  col.COLUMN_NAME ,
        col.DATA_TYPE ,
        col.CHARACTER_MAXIMUM_LENGTH ln ,
        CAST(ISNULL(j.is_primary, 0) AS BIT) is_primary
FROM    INFORMATION_SCHEMA.COLUMNS col
        LEFT JOIN ( SELECT  K.TABLE_NAME ,
                            K.COLUMN_NAME ,
                            CASE WHEN K.CONSTRAINT_NAME IS NULL THEN 0
                                 WHEN K.CONSTRAINT_NAME IS NOT NULL THEN 1
                            END is_primary
                    FROM    INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS C
                            JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS K ON C.TABLE_NAME = K.TABLE_NAME
                                                              AND C.CONSTRAINT_CATALOG = K.CONSTRAINT_CATALOG
                                                              AND C.CONSTRAINT_SCHEMA = K.CONSTRAINT_SCHEMA
                                                              AND C.CONSTRAINT_NAME = K.CONSTRAINT_NAME
                    WHERE   C.CONSTRAINT_TYPE = 'PRIMARY KEY'
                            AND C.TABLE_NAME = 'tablename'
                  ) j ON col.COLUMN_NAME = j.COLUMN_NAME
WHERE   col.TABLE_NAME = 'tablename'
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top