为什么 sys.columns 和 INFORMATION_SCHEMA.COLUMNS 显示不同的列数

Vin*_* _S 13 sql-server

我正在尝试两种方法来显示具有特定名称的列:

  1. INFORMATION_SCHEMA.COLUMNS

    SELECT *
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME='SUPPLIER_NAME';
    
    Run Code Online (Sandbox Code Playgroud)
  2. 系统列

    SELECT *
    FROM SYS.COLUMNS
    WHERE NAME='SUPPLIER_NAME'
    
    Run Code Online (Sandbox Code Playgroud)

为什么查询显示不同的输出?

SSMS 屏幕抓取

Ken*_*her 18

INFORMATION_SCHEMA.COLUMNS和之间的区别在于sys.columns它们涵盖的对象类型。INFORMATION_SCHEMA.COLUMNS仅限于表和视图。您可以通过执行以下操作来查看其背后的代码:

EXEC sp_helptext [INFORMATION_SCHEMA.COLUMNS]
Run Code Online (Sandbox Code Playgroud)

如果您查看 where 子句的底部,您会看到

o.type IN ('U', 'V')
Run Code Online (Sandbox Code Playgroud)

这是它仅限于表和视图的地方。

如果然后查看 sys.columns 的定义,您将看到它包含许多其他对象的列:

  • 表值汇编函数 (FT)
  • 内联表值 SQL 函数 (IF)
  • 内部表 (IT)
  • 系统表 (S)
  • 表值 SQL 函数 (TF)

运行这个,你将能够看到额外的对象是什么以及它是什么类型。

SELECT OBJECT_SCHEMA_NAME(object_id), OBJECT_NAME(object_id), 
    OBJECTPROPERTYEX(object_id, 'BASETYPE'), *
FROM sys.columns
Run Code Online (Sandbox Code Playgroud)