为什么“sysfiles1”会出现在 SQL Server 2008 的 sys.objects 目录视图中?

Jes*_*ber 3 sql-server-2008 sql-server

我们最近使用这个查询在我们的数据库中查找没有聚集索引的表,发现它返回的结果之一是“sys.sysfiles1”表。我们正在运行 SQL Server 2008,我的印象是该表不再使用(正如一些答案指出的那样,似乎存在一种误解,即该表仅存在于从 SQL Server 2000 升级的数据库)。此外,我无法直接从 sys.sysfiles1 表中选择任何内容(尽管我可以直接从 sys.sysfiles 视图中选择)。

运行以下命令以针对本地安装的 SQL Server 2008 (@@version = Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64),尽管我们已经在 SQL Server 的生产实例中看到它) 创建一个新数据库2008 年)也说明了我的意思:

CREATE DATABASE SysFilesTesting
--returns a row:
SELECT * FROM SysFilesTesting.sys.objects where name = 'sysfiles1'
--throws 'invalid object name' error:
SELECT * FROM SysFilesTesting.sys.sysfiles1
Run Code Online (Sandbox Code Playgroud)

为什么 sys.objects 报告 sysfiles1 表的存在?

gbn*_*gbn 5

有很多

SELECT * FROM sys.objects where name LIKE 'sys%'
Run Code Online (Sandbox Code Playgroud)

这些确实是您数据库中的对象 在
内部,其他有用的对象(例如 sys.objects)实际上并不存在于您的数据库中。


Rem*_*anu 5

sysfiles1是内部目录表。其中有很多(基本上,object_id 介于 1 和 99 之间的任何表,根据定义,都是内部目录表)。查询编译器拒绝在正常上下文下将查询绑定到它们,因此如果您尝试从它们中进行选择,则会出现您看到的错误。DAC 连接可以绑定到它们并检索数据,但您仍然无法更新它们。

这在 MSDN 上都有描述,请参阅System Base Tables

sysfiles1虽然是一种特殊情况,上面的链接中没有记录。此目录表仅存在于从 SQL 2000 升级的数据库中。见http://blogs.msdn.com/b/sqlserverstorageengine/archive/2006/09/19/761437.aspx

... sysfiles1 表是一个链接堆。此表包含构成数据库的文件的位置...