Pourquoi sys.columns et INFORMATION_SCHEMA.COLUMNS affichent un nombre différent de colonnes

11

J'essaie deux méthodes pour afficher les colonnes avec un nom particulier:

  1. INFORMATION_SCHEMA.COLUMNS

    SELECT *
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME='SUPPLIER_NAME';
    
  2. SYS.COLUMNS

    SELECT *
    FROM SYS.COLUMNS
    WHERE NAME='SUPPLIER_NAME'
    

Pourquoi les requêtes affichent-elles des sorties différentes?

Capture d'écran SSMS

Vinoth _S
la source
Je n'ai que 4 colonnes dans ma base de données, mais à l'aide de sys.columns, il ne s'affiche pas.
Vinoth _S
3
INFORMATION_SCHEMA.COLUMNSest juste une vue sur sys.columnsce INNER JOINs pour sys.objectset restreigne aux seuls types d'objets de table ou la vue. Je suppose que l'un de vos enregistrements sys.columnsest éliminé dans cette restriction.
Mark Sinkinson
1
Ils sont tous les deux un peu différents. Veuillez lire mssqltips.com/sqlservertutorial/183/informationschemacolumns et msdn.microsoft.com/en-us/library/ms176106.aspx Je dirais que vous devriez avoir lu la documentation avant de poster
Shanky

Réponses:

14

La différence entre INFORMATION_SCHEMA.COLUMNSet sys.columnsest le type d'objet qu'ils couvrent. INFORMATION_SCHEMA.COLUMNSest limité aux tables et aux vues. Vous pouvez jeter un œil au code qui se cache derrière en procédant comme suit:

EXEC sp_helptext [INFORMATION_SCHEMA.COLUMNS]

Si vous regardez en bas de la clause where, vous verrez

o.type IN ('U', 'V')

C'est là qu'il est limité aux tables et aux vues uniquement.

Si vous allez ensuite regarder la définition de sys.columns, vous verrez qu'elle comprend des colonnes pour un certain nombre d'autres objets:

  • Fonctions d'assemblage table (FT)
  • Fonctions SQL de table en ligne (IF)
  • Tables internes (IT)
  • Tables système (S)
  • Fonctions SQL table (TF)

Exécutez ceci et vous pourrez voir quel est l'objet supplémentaire et de quel type il s'agit.

SELECT OBJECT_SCHEMA_NAME(object_id), OBJECT_NAME(object_id), 
    OBJECTPROPERTYEX(object_id, 'BASETYPE'), *
FROM sys.columns
Kenneth Fisher
la source