Por que sys.columns e INFORMATION_SCHEMA.COLUMNS exibem um número diferente de colunas

11

Estou tentando dois métodos para exibir as colunas com um nome específico:

  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'

Por que as consultas exibem saídas diferentes?

Captura de tela do SSMS

Vinoth _S
fonte
Eu tenho apenas 4 colunas no meu banco de dados. Mas usando sys.columns ele exibirá 5 registros eu não não Por que?
Vinoth _S
3
INFORMATION_SCHEMA.COLUMNSé apenas uma vista sobre sys.columnsque INNER JOINs para sys.objectse restringe a tipos de objeto de tabela ou exibição. Meu palpite é que um de seus registros sys.columnsé eliminado nesta restrição.
Mark Sinkinson
1
Ambos são um pouco diferentes. Por favor, leia mssqltips.com/sqlservertutorial/183/informationschemacolumns e msdn.microsoft.com/en-us/library/ms176106.aspx eu diria que você deve ter a documentação Leia antes de postar
shanky

Respostas:

14

A diferença entre INFORMATION_SCHEMA.COLUMNSe sys.columnsé o tipo de objeto que eles cobrem. INFORMATION_SCHEMA.COLUMNSé restrito a tabelas e visualizações. Você pode dar uma olhada no código por trás dele, fazendo o seguinte:

EXEC sp_helptext [INFORMATION_SCHEMA.COLUMNS]

Se você olhar para o final da cláusula where, verá

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

É aqui que ele é restrito apenas às tabelas e visualizações.

Se você observar a definição de sys.columns, verá que ela inclui colunas para vários outros objetos:

  • Funções de montagem com valor de tabela (FT)
  • Funções SQL (IF) com valor de tabela embutido
  • Tabelas internas (TI)
  • Tabelas de sistema (S)
  • Funções SQL (TF) com valor de tabela

Execute isso e você poderá ver qual é o objeto extra e que tipo.

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