【症状】

若要删除一个表中的数据中MicrosoftSQLServer使用DELETE语句后,您可能会注意到不完全释放表使用的空间。当您然后试图在数据库中插入数据时,您可能会收到以下错误消息:

无法分配空间的数据库中的对象TableNameDatabaseName,因为PRIMARY的文件组已满。

【原因】
因为SQLServer只释放一个堆表使用以下条件为真时的所有页面,就会出现此问题:

  • 此表上的删除时发生。

  • 表级锁正被使用。

注意堆表是不是聚集索引与相关联的任何表。

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

但是时启用了SQLServer2005数据库中的行基于版本控制的隔离级别,页不能是即使释放表级锁正被使用

【替代方法】

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

  • DELETE语句中包括了TABLOCK提示,如果未启用行基于版本控制的隔离级别。例如对于使用与以下内容类似的语句:

    DELETEFROM<TableName>WITH(TABLOCK)

    注意<TableName>值,该值代表表格的名称。


  • 如果您想要删除表中的所有记录,请使用TRUNCATETABLE语句。例如对于使用与以下内容类似的语句:

    TRUNCATETABLE<TableName>


  • 表的列上创建聚集的索引。有关如何在表上创建聚集的索引的详细信息请参阅SQLServer联机丛书中的创建一个聚集索引"主题。