Come faccio a determinare se una colonna è nella chiave primaria della sua tabella? (Server SQL)
-
03-07-2019 - |
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?
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'