sql server 无法对数据库的数据库名称中的表名对象分配空间,因为主文件组已满 解决

微软官网的原文是:

表使用的空间不会被完全释放后使用 DELETE 语句可以从 SQL Server 中的表中删除数据


重要提示:本文章是 Microsoft 软件自动翻译的结果,而非专业译者翻译的结果。 Microsoft 提供专业人员翻译的文章、由自动翻译生成的文章以及来自 Microsoft 社区的文章翻译,因此你能够以自己的语言阅读所有知识库文章。 需要注意的是,由自动翻译生成的文章(包括 Microsoft 社区审阅的文章)可能包含词汇、句法或语法错误。 对于因不正确的内容翻译或使用不正确的内容翻译而造成的不准确或错误或任何损害,Microsoft 概不负责。

查看原始英文文章:913399

错误 #: 219514 (SQL Server 8.0)

症状


在 Microsoft SQL Server 使用 DELETE 语句从表中删除数据后,您可能会注意到表使用的空间不会被完全释放。当然后尝试在数据库中插入数据时,您可能会收到以下错误消息︰

无法对数据库的数据库名称中的表名对象分配空间,因为主文件组已满。

注意:表名表示的表的名称。数据库名称表示包含表的数据库的名称。

原因


因为 SQL Server 仅释放所有页堆表使用以下条件为真时,将发生此问题︰

  • 发生在此表上的删除。
  • 正在保存表级锁。

注意:堆表是不是有一个聚集索引相关联的任何表。

如果页不会被释放,其他数据库中的对象不能重新使用页面。

但是,当您启用 SQL Server 2005 数据库中的行基于版本的隔离级别,页面无法释放即使主办表级锁。有关行版本控制基于隔离级别的详细信息,请参阅 SQL Server 2005 联机丛书中的"使用行版本控制基于隔离级别"主题。

解决方法


若要变通解决此问题,请使用下列方法之一:

  • DELETE 语句中包括 TABLOCK 提示,如果未启用行基于版本的隔离级别。例如,使用类似于下面的语句︰
    DELETE FROM <TableName> WITH (TABLOCK)
    注意:< 第 >表示的表的名称。
  • 如果您想要删除表中的所有记录,请使用截断表语句。例如,使用类似于下面的语句︰
    TRUNCATE TABLE <TableName>
  • 在表的列上创建一个聚集的索引。有关如何在表上创建聚集的索引的详细信息,请参阅 SQL Server 联机丛书中的"创建聚集索引"主题。

状态


Microsoft 已经确认这是“适用于”一节中列出的 Microsoft 产品中的问题。

猜你喜欢

转载自blog.csdn.net/humadivinity/article/details/85094916