¿Por qué sys.columns y INFORMATION_SCHEMA.COLUMNS muestran un número diferente de columnas?

11

Estoy probando dos métodos para mostrar las columnas con un nombre en particular:

  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 qué las consultas muestran resultados diferentes?

Captura de pantalla de SSMS

Vinoth _S
fuente
Solo tengo 4 columnas en mi base de datos, pero usando sys.columns se mostrará 5 Registro, no, ¿por qué?
Vinoth _S
3
INFORMATION_SCHEMA.COLUMNSes solo una vista sobre sys.columnsese INNER JOINs sys.objectsy se restringe a los tipos de objeto de Tabla o Vista. Supongo que uno de sus registros sys.columnsse elimina en esta restricción.
Mark Sinkinson
1
Ambos son un poco diferentes. Lea mssqltips.com/sqlservertutorial/183/informationschemacolumns y msdn.microsoft.com/en-us/library/ms176106.aspx . Diría que debería haber leído la documentación antes de publicarla
Shanky

Respuestas:

14

La diferencia entre INFORMATION_SCHEMA.COLUMNSy sys.columnses el tipo de objeto que cubren. INFORMATION_SCHEMA.COLUMNSestá restringido a tablas y vistas. Puedes echar un vistazo al código detrás de esto haciendo esto:

EXEC sp_helptext [INFORMATION_SCHEMA.COLUMNS]

Si miras la parte inferior de la cláusula where, verás

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

Aquí es donde está restringido solo a las tablas y vistas.

Si luego observa la definición de sys.columns, verá que incluye columnas para otros objetos:

  • Funciones de ensamblaje con valores de tabla (FT)
  • Funciones SQL (IF) con valores de tabla en línea
  • Tablas internas (IT)
  • Tablas del sistema (S)
  • Funciones SQL con valores de tabla (TF)

Ejecute esto y podrá ver cuál es el objeto adicional y de qué tipo es.

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