Warum zeigen sys.columns und INFORMATION_SCHEMA.COLUMNS eine unterschiedliche Anzahl von Spalten an?

11

Ich versuche zwei Methoden, um die Spalten mit einem bestimmten Namen anzuzeigen:

  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'

Warum zeigen die Abfragen unterschiedliche Ausgaben an?

SSMS Screen Grab

Vinoth _S
quelle
Ich habe nur 4 Spalten in meiner Datenbank. Bei Verwendung von sys.columns wird jedoch nicht angezeigt. 5 Datensatz i not no Warum?
Vinoth _S
3
INFORMATION_SCHEMA.COLUMNSist nur einen Blick auf sys.columnsdiese INNER JOINs zu sys.objectsund engt auf Objekttypen der Tabelle oder Ansicht. Ich vermute, dass einer Ihrer Datensätze sys.columnsin dieser Einschränkung beseitigt ist.
Mark Sinkinson
1
Sie sind beide ein bisschen unterschiedlich. Bitte lesen Sie mssqltips.com/sqlservertutorial/183/informationschemacolumns und msdn.microsoft.com/en-us/library/ms176106.aspx Ich würde sagen, Sie sollten die Dokumentation vor dem Posten gelesen haben
Shanky

Antworten:

14

Der Unterschied zwischen INFORMATION_SCHEMA.COLUMNSund sys.columnsbesteht in den Objekttypen, die sie abdecken. INFORMATION_SCHEMA.COLUMNSist auf Tabellen und Ansichten beschränkt. Sie können sich den Code dahinter ansehen, indem Sie Folgendes tun:

EXEC sp_helptext [INFORMATION_SCHEMA.COLUMNS]

Wenn Sie unten in der where-Klausel nachsehen, werden Sie sehen

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

Hier ist es nur auf die Tabellen und Ansichten beschränkt.

Wenn Sie sich dann die Definition von sys.columns ansehen, werden Sie feststellen, dass sie Spalten für eine Reihe anderer Objekte enthält:

  • Tabellenwertige Montagefunktionen (FT)
  • Inline-SQL-Funktionen mit Tabellenwert (IF)
  • Interne Tabellen (IT)
  • Systemtabellen (S)
  • SQL-Funktionen mit Tabellenwert (TF)

Wenn Sie dies ausführen, können Sie sehen, um welches zusätzliche Objekt es sich handelt und um welchen Typ es sich handelt.

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