3

Comment imprimer une «clé primaire» pour la colonne avec la clé primaire? Je reçois la 'clé primaire' pour toutes les colonnes si la table a une clé primaire, au lieu d'une colonne avec la clé primaire et les autres colonnes comme vides dans keyType.Schéma d'information et clés primaires

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 
+0

double possible de [Comment déterminer une clé primaire pour une table dans SQL Server?] (Http://stackoverflow.com/questions/ 1349357/comment-déterminer-une-clé-primaire-pour-une-table-en-sql-server) –

Répondre

23
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 
+1

EXCELLENT TRAVAIL, c'est exactement ce que je voulais ... J'aimerais pouvoir vous donner plus de points. : o) – cdub

0

En complément, pensez à regarder:

sp_helptext N'sp_help' 

Parfois, l'apprentissage de l'équipe MS est une bonne chose. :-)

+0

Ceci génère 230 lignes de code. Qu'est-ce que c'est? – slartidan

0

un très petit ajouter à la première réponse. Il est possible de voir en même temps le MS_Description (ou d'autres propriétés étendent)

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