系统兼容性视图 (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric 中的 SQL 分析终结点Microsoft Fabric 中的仓库

SQL Server 早期版本中的许多系统表现在作为一组视图实现。 这些视图称为兼容性视图,仅用于向后兼容。 兼容性视图公开 SQL Server 2000(8.x)中可用的相同元数据。 但是,兼容性视图不会公开与 SQL Server 2005(9.x)及更高版本中引入的功能相关的任何元数据。 因此,使用新功能(如 Service Broker 或分区)时,必须切换到使用目录视图。

升级到目录视图的另一个原因是,存储用户 ID 和类型 ID 的兼容性视图列可能返回 NULL 或触发算术溢出。 这是因为您可以创建超过 32,767 个用户、组和角色,以及超过 32,767 种数据类型。 例如,如果要创建 32,768 个用户,然后运行以下查询: SELECT * FROM sys.sysusers 如果 ARITHABORT 设置为 ON,则查询会失败,并出现算术溢出错误。 如果 ARITHABORT 设置为 OFF,则 uid 列返回 NULL。

若要避免这些问题,建议您使用新增的目录视图,这些视图可以处理增加的用户 ID 和类型 ID 数目。 下表列出了会出现此溢出的列。

列名称 兼容性视图 SQL Server 2005 视图
xusertype syscolumns sys.columns
usertype syscolumns sys.columns
memberuid sysmembers sys.database_role_members
groupuid sysmembers sys.database_role_members
uid sysobjects sys.objects
uid sysprotects sys.database_permissions

sys.server_permissions
grantor sysprotects sys.database_permissions

sys.server_permissions
xusertype systypes sys.types
uid systypes sys.types
uid sysusers sys.database_principals
altuid sysusers sys.database_principals
gid sysusers sys.database_principals
uid syscacheobjects sys.dm_exec_plan_attributes
uid sysprocesses sys.dm_exec_requests

在用户数据库中引用时,SQL Server 2000(如 syslanguagessyscacheobjects)中宣布弃用的系统表现在绑定到 sys 架构中的后兼容性视图。 因为多个版本均已不推荐使用 SQL Server 2000 系统表,此更改不被视为重大更改。

示例:如果用户在用户数据库(SQL Server 2008)中创建名为 syslanguages 的用户表,该数据库中的语句 SELECT * from dbo.syslanguages; 将返回用户表中的值。 从 SQL Server 2012 开始,这种做法将从系统视图 sys.syslanguages 返回数据。

另请参阅

目录视图 (Transact-SQL)
将系统表映射到系统视图 (Transact-SQL)