查询 SQL Server 系统目录

对于没有进行硬编码以便与特定的表和视图集一起工作的动态应用程序,它必须具有一种机制用于确定任何与之相连的数据库中对象的结构和属性。这些应用程序可能需要如下信息:

  • 数据库中表和视图的数目和名称。

  • 表或视图中的列数以及每一列的名称、数据类型、小数位数和精度。

  • 为表定义的约束。

  • 为表定义的索引和键。

系统目录可为 SQL Server 数据库提供此信息。SQL Server 系统目录的核心是一个视图集,这些视图显示了描述 SQL Server 实例中的对象的元数据。元数据是描述系统中对象属性的数据。基于 SQL Server 的应用程序可以使用以下方式访问系统目录中的信息:

  • 目录视图。建议使用这种访问方法。

  • 信息架构视图。

  • OLE DB 架构行集。

  • ODBC 目录函数。

  • 系统存储过程和函数。

目录视图

通过这些目录视图可以访问服务器上各数据库中存储的元数据。

注意注意

目录视图不提供对复制、SQL Server 代理或备份元数据的访问。

建议使用目录视图访问元数据,原因如下:

  • 所有元数据都作为目录视图提供。

  • 目录视图以一种独立于所有目录表实现的格式来表示元数据,因此,不受基础目录表变化的影响。

  • 目录视图是访问核心服务器元数据的最有效的方式。

  • 目录视图是目录元数据的常规界面,提供了获取、转换以及表示此自定义形式的元数据的最直接的方式。

  • 目录视图名称和它们的列名称是说明性的。查询结果将与具备该功能(与正被查询的元数据相对应)中等知识的用户期望一致。

例如,以下查询使用 sys.objects 目录视图来返回在最近 10 天内修改过的所有数据库对象。

SELECT name AS object_name 
  ,SCHEMA_NAME(schema_id) AS schema_name
  ,type_desc
  ,create_date
  ,modify_date
FROM sys.objects
WHERE modify_date > GETDATE() - 10
ORDER BY modify_date;

有关使用目录视图来查询系统目录的更多示例,请参阅 查询 SQL Server 系统目录常见问题

重要说明重要提示

在 SQL Server 的未来版本中,Microsoft 可能会通过在列列表的末尾添加列来扩充任何系统目录视图的定义。我们建议不要在生产代码中使用语法 SELECT * FROM sys.catalog_view_name,这是因为返回的列数可能会更改并破坏应用程序的运行。

信息架构视图

信息架构视图基于的是 ISO 标准中的目录视图定义。它们以一种独立于所有目录表实现的格式来表示目录信息,因此不受基础目录表变化的影响。使用这些视图的应用程序可在符合 ISO 标准的异类数据库系统之间移植。有关详细信息,请参阅信息架构视图 (Transact-SQL)

注意注意

信息架构视图不包含 SQL Server 2008 特有的元数据。

下面的示例查询了 INFORMATION_SCHEMA.COLUMNS 视图以返回 AdventureWorks2008R2 数据库中的 Person 表的所有列。

SELECT TABLE_NAME, COLUMN_NAME, COLUMNPROPERTY(OBJECT_ID(TABLE_SCHEMA + '.' + TABLE_NAME), COLUMN_NAME, 'ColumnID') AS COLUMN_ID
FROM AdventureWorks2008R2.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Person';

兼容性视图

许多 SQL Server 早期版本中的系统表现在都实现为视图集。这些视图称为兼容性视图,它们仅用于向后兼容。它们显示的元数据与 SQL Server 2000 中提供的相同。但是,它们不显示与 SQL Server 2005 及更高版本中引入的功能关联的任何元数据。因此,当使用新功能(例如,Service Broker 或分区)时,必须切换至使用目录视图。这是升级至目录视图的一个充分原因。升级至目录视图的另外一个原因是存储用户 ID 和类型 ID 的兼容性视图列可能返回 NULL 或触发器算术溢出。这是因为在 SQL Server 2005 及更高版本中可以创建超过 32,767 个用户和数据类型。例如,如果您要创建 32,768 个用户,然后运行查询 SELECT * FROM sys.sysusers;并且 ARITHABORT 设置为 ON,则查询将因算术溢出错误而失败。如果 ARITHABORT 设置为 OFF,uid 列将返回 NULL。

为避免出现这些问题,建议升级到使用可以处理增加的用户 ID 和类型 ID 数量的新目录视图。

OLE DB 架构行集

OLE DB 规范定义了一个 IDBSchemaRowset 接口,该接口公开了一组包含目录信息的架构行集。OLE DB 架构行集是显示不同的 OLE DB 访问接口所支持的目录信息的标准方法。行集独立于基础目录表的结构。有关详细信息,请参阅架构行集支持 (OLE DB)

Microsoft SQL Server Native Client OLE DB 访问接口支持 IDBSchemaRowset 的扩展插件,该扩展插件可报告分布式查询中使用的链接服务器的目录信息。有关详细信息,请参阅 LINKEDSERVERS 行集 (OLE DB)

ODBC 目录函数

ODBC 规范定义了一组目录函数,该目录函数能够返回包含目录信息的结果集。这些函数是显示不同的 ODBC 驱动程序所支持的目录信息的标准方法。结果集独立于基础目录表结构。

SQL Server Native Client ODBC 驱动程序支持两个特定于驱动程序的函数,这些函数可为分布式查询所用的链接服务器报告目录信息。有关详细信息,请参阅使用目录函数

系统存储过程和函数

Transact-SQL 定义了返回目录信息的服务器系统存储过程和系统函数。虽然这些存储过程和函数为 SQL Server 所特有,但它们使用户与基础系统目录表的结构隔离开了。有关详细信息,请参阅元数据函数 (Transact-SQL)系统存储过程 (Transact-SQL)