Почему sys.columns и INFORMATION_SCHEMA.COLUMNS отображают различное количество столбцов

11

Я пытаюсь двумя способами для отображения столбцов с определенным именем:

  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'

Почему запросы показывают разные результаты?

Захват экрана SSMS

Vinoth _S
источник
У меня есть только 4 столбца в моей базе данных. Но при использовании sys.columns он отображает 5 записей. Нет, почему?
Винот _S
3
INFORMATION_SCHEMA.COLUMNSэто просто вид , sys.columnsчто INNER JOINс к sys.objectsи ограничивает к типам объектов таблицы или представления. Я предполагаю, что одна из ваших записей sys.columnsисключена из этого ограничения.
Марк Синкинсон
1
Они оба немного разные. Пожалуйста, прочитайте mssqltips.com/sqlservertutorial/183/informationschemacolumns и msdn.microsoft.com/en-us/library/ms176106.aspx. Я бы сказал, что вы должны прочитать документацию перед публикацией
Шэнки

Ответы:

14

Разница между INFORMATION_SCHEMA.COLUMNSи sys.columnsявляются типами объектов , они охватывают. INFORMATION_SCHEMA.COLUMNSограничен таблицами и представлениями. Вы можете взглянуть на код, стоящий за ним:

EXEC sp_helptext [INFORMATION_SCHEMA.COLUMNS]

Если вы посмотрите внизу в предложении, где вы увидите

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

Здесь он ограничен только таблицами и представлениями.

Если вы затем посмотрите на определение sys.columns, то увидите, что оно включает столбцы для ряда других объектов:

  • Табличные функции сборки (FT)
  • Встроенные табличные функции SQL (IF)
  • Внутренние столы (ИТ)
  • Системные таблицы (S)
  • Табличные функции SQL (TF)

Запустите это, и вы сможете увидеть, что это за дополнительный объект и какого он типа.

SELECT OBJECT_SCHEMA_NAME(object_id), OBJECT_NAME(object_id), 
    OBJECTPROPERTYEX(object_id, 'BASETYPE'), *
FROM sys.columns
Кеннет Фишер
источник