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


11

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

  1. INFORMATION_SCHEMA.COLUMNS

    SELECT *
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME='SUPPLIER_NAME';
  2. 系统列

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

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

SSMS屏幕抓取


我的数据库中只有4列,但是使用sys.columns却无法显示5条记录我不知道为什么?
Vinoth _S 2014年

3
INFORMATION_SCHEMA.COLUMNS只是对s 的视图sys.columns,并仅限于Table或View的对象类型。我的猜测是,您的记录之一已被取消此限制。INNER JOINsys.objectssys.columns
马克·辛金森

1
他们俩有点不同。请阅读mssqltips.com/sqlservertutorial/183/informationschemacolumnsmsdn.microsoft.com/en-us/library/ms176106.aspx我想说,您应该在发布之前阅读过文档
Shanky

Answers:


14

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

EXEC sp_helptext [INFORMATION_SCHEMA.COLUMNS]

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

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

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

然后,如果您查看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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.