Comment imprimer une «clé primaire» pour la colonne avec la clé primaire?
Je reçois 'clé primaire' pour toutes les colonnes si la table a une clé primaire, au lieu de la colonne avec la clé primaire et les autres colonnes comme vide dans KeyType. P>
SELECT c.TABLE_NAME, c.COLUMN_NAME, c.DATA_TYPE, c.Column_default, c.character_maximum_length, c.numeric_precision, c.is_nullable, CASE WHEN u.CONSTRAINT_TYPE = 'PRIMARY KEY' THEN 'primary key' ELSE '' END AS KeyType FROM INFORMATION_SCHEMA.COLUMNS as c LEFT JOIN information_schema.table_constraints as u ON c.table_name = u.table_name ORDER BY table_name
4 Réponses :
SELECT c.TABLE_NAME, c.COLUMN_NAME,c.DATA_TYPE, c.Column_default, c.character_maximum_length, c.numeric_precision, c.is_nullable ,CASE WHEN pk.COLUMN_NAME IS NOT NULL THEN 'PRIMARY KEY' ELSE '' END AS KeyType FROM INFORMATION_SCHEMA.COLUMNS c LEFT JOIN ( SELECT ku.TABLE_CATALOG,ku.TABLE_SCHEMA,ku.TABLE_NAME,ku.COLUMN_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tc INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS ku ON tc.CONSTRAINT_TYPE = 'PRIMARY KEY' AND tc.CONSTRAINT_NAME = ku.CONSTRAINT_NAME ) pk ON c.TABLE_CATALOG = pk.TABLE_CATALOG AND c.TABLE_SCHEMA = pk.TABLE_SCHEMA AND c.TABLE_NAME = pk.TABLE_NAME AND c.COLUMN_NAME = pk.COLUMN_NAME ORDER BY c.TABLE_SCHEMA,c.TABLE_NAME, c.ORDINAL_POSITION
Excellent travail, c'est exactement ce que je voulais ... J'aimerais pouvoir vous donner plus de points. : o)
TC Rejoindre Ku est manquant sur ... et tc.constraintore_catalog = ku.constraint_catalog et tc.constraint_schema = ku.constraint_schema
A plus d'addition, envisagez de regarder: Parfois, apprendre de l'équipe MS est une bonne chose. : -) p> p>
Un très petit ajouter à la première réponse. Il est possible de visualiser dans la même heure les MS_Description (ou d'autres propriétés d'étendue)
SELECT c.TABLE_NAME, c.COLUMN_NAME,c.DATA_TYPE, c.Column_default, c.character_maximum_length, c.numeric_precision, c.is_nullable ,CASE WHEN pk.COLUMN_NAME IS NOT NULL THEN 'PRIMARY KEY' ELSE '' END AS KeyType, c.ORDINAL_POSITION ,convert(varchar(8000), ex.value) as coln FROM INFORMATION_SCHEMA.COLUMNS c LEFT JOIN ( SELECT ku.TABLE_CATALOG,ku.TABLE_SCHEMA,ku.TABLE_NAME,ku.COLUMN_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tc INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS ku ON tc.CONSTRAINT_TYPE = 'PRIMARY KEY' AND tc.CONSTRAINT_NAME = ku.CONSTRAINT_NAME ) pk ON c.TABLE_CATALOG = pk.TABLE_CATALOG AND c.TABLE_SCHEMA = pk.TABLE_SCHEMA AND c.TABLE_NAME = pk.TABLE_NAME AND c.COLUMN_NAME = pk.COLUMN_NAME outer apply ::fn_listextendedproperty('MS_Description', 'schema', 'dbo', 'table', c.TABLE_NAME, 'column', c.COLUMN_NAME) ex ORDER BY c.TABLE_SCHEMA,c.TABLE_NAME, c.ORDINAL_POSITION
J'ai trouvé ce code ci-dessous pour être la méthode la plus simple pour trouver la clé primaire d'une table. Elle exige seulement une jointure externe gauche entre les balises INFORMATION_SCHEMA.COLUMNS strong> table et information_schema.key_column_usage strong> Tableau Select
col.column_name,
col.data_type,
col.ordinal_position,
col.is_nullable,
case when ky.COLUMN_NAME is null then 0 else 1 end as primary_key_flag
from <your-catalog>.Information_Schema.columns col
left outer join <your-catalog>.INFORMATION_SCHEMA.KEY_COLUMN_USAGE ky
on ky.COLUMN_NAME = col.COLUMN_NAME and ky.TABLE_NAME = col.TABLE_NAME
and ky.TABLE_CATALOG = col.TABLE_CATALOG and ky.table_name = col.table_name
where
col.TABLE_NAME = '<your-table-name>'
and col.table_catalog = '<your-catalog>';
Dupliqué possible de Comment déterminer un primaire Touche pour une table dans SQL Server?