Dlaczego sys.columns i INFORMACJE_SCHEMA.KOLUMNY wyświetlają inną liczbę kolumn

11

Próbuję dwóch metod wyświetlania kolumn o określonej nazwie:

  1. INFORMACJE_SCHEMA.KOLUMNY

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

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

Dlaczego zapytania wyświetlają inne dane wyjściowe?

Zrzut ekranu SSMS

Vinoth _S
źródło
Mam tylko 4 kolumny w mojej bazie danych. Ale używając sys.columns wyświetla się źle 5 Nagrywam, że nie, dlaczego?
Vinoth _S.
3
INFORMATION_SCHEMA.COLUMNSjest tylko widok sys.columnstego INNER JOINs do sys.objectsi ogranicza do typów obiektów z tabeli lub widoku. Domyślam się, że jeden z twoich zapisów sys.columnszostał wyeliminowany w tym ograniczeniu.
Mark Sinkinson
1
Oba są trochę inne. Proszę przeczytać mssqltips.com/sqlservertutorial/183/informationschemacolumns i msdn.microsoft.com/en-us/library/ms176106.aspx Powiedziałbym, że powinieneś przeczytać dokumentację przed wysłaniem
Shanky

Odpowiedzi:

14

Różnica pomiędzy INFORMATION_SCHEMA.COLUMNSi sys.columnsjest typy obiektów, które obejmują. INFORMATION_SCHEMA.COLUMNSjest ograniczony do tabel i widoków. Możesz rzucić okiem na kod za tym, wykonując następujące czynności:

EXEC sp_helptext [INFORMATION_SCHEMA.COLUMNS]

Jeśli spojrzysz na dół w klauzuli where, zobaczysz

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

Tutaj ogranicza się tylko do tabel i widoków.

Jeśli przyjrzysz się definicji sys.columns, zobaczysz, że zawiera ona kolumny dla wielu innych obiektów:

  • Funkcje zespołu wycenione według tabeli (FT)
  • Wbudowane w tabelę funkcje SQL (IF)
  • Tabele wewnętrzne (IT)
  • Tabele systemowe (S)
  • Funkcje SQL wycenione w tabeli (TF)

Uruchom to, a zobaczysz, co to jest dodatkowy obiekt i jakiego typu.

SELECT OBJECT_SCHEMA_NAME(object_id), OBJECT_NAME(object_id), 
    OBJECTPROPERTYEX(object_id, 'BASETYPE'), *
FROM sys.columns
Kenneth Fisher
źródło