由于“ACTIVE_TRANSACTION”,数据库“tempdb”的事务日志已满

新手上路,请多包涵

我正在使用 Microsoft SQL Server 2014 并在尝试创建临时表时遇到了一些问题。我之前运行过这个代码一次没有问题,但是当我今天尝试运行查询时,我收到了两个错误之一“数据库中已经有一个名为’#AllClasses’的对象”或“数据库的事务日志由于 ‘ACTIVE_TRANSACTION’,’tempdb’ 已满。”我在下面粘贴了一部分代码:

     CREATE TABLE #AllClasses(studentId uniqueidentifier, ClassName nvarchar(100), SchoolName nvarchar(100), AcademicYearId uniqueidentifier, UserGroupId uniqueidentifier, SchoolId uniqueidentifier, ClassId uniqueidentifier,  UserGroupOrganizationStatusId tinyint);

    CREATE UNIQUE INDEX #I_AllClasses ON #AllClasses (StudentId, UserGroupId);

    INSERT #AllClasses(studentId, ClassName, SchoolName, AcademicYearId, UserGroupId, SchoolId, sc.ClassId, u.UserGroupOrganizationStatusId)

    SELECT sc.studentId, c.ClassName, u.UserGroupOrganizationName, c.AcademicYearId, c.UserGroupId, c.SchoolId, sc.ClassId, u.UserGroupOrganizationStatusId
    FROM StudentClassCrossReference sc
    INNER JOIN class c ON sc.ClassId = c.classId
    INNER JOIN School s ON s.SchoolId = c.SchoolId
    INNER JOIN dbo.UserGroupOrganization u ON u.UserGroupOrganizationId = s.UserGroupOrganizationId
    GROUP BY sc.studentId, c.classname, u.UserGroupOrganizationName, u.UserGroupOrganizationId, c.AcademicYearId, c.UserGroupId, c.SchoolId, sc.ClassId, u.UserGroupOrganizationStatusId
    HAVING u.UserGroupOrganizationStatusId = 0

当我尝试删除表时,我收到一个新错误,内容为“无法删除表 ‘#All Classes’,因为它不存在或您没有权限。”

         DROP Table #LS25Student, #AllClasses, #LS25PageSession, #LS25PsByClass

当我尝试使用 IF 语句删除表时,我收到错误消息“由于 ‘ACTIVE_TRANSACTION’,’tempdb’ 的事务日志已满。”

     IF OBJECT_ID('tempdb.dbo.#AllClasses', 'U') IS NOT NULL
      DROP TABLE #AllClasses;

    IF OBJECT_ID('tempdb.dbo.#LS25Student', 'U') IS NOT NULL
      DROP TABLE #LS25Student;

    IF OBJECT_ID('tempdb.dbo.#LS25PageSession', 'U') IS NOT NULL
      DROP TABLE #LS25PageSession;

    IF OBJECT_ID('tempdb.dbo.#LS25PsByClass', 'U') IS NOT NULL
      DROP TABLE #LS25PsByClass;

我能够毫无问题地运行其他查询。任何修复此特定查询的建议将不胜感激。

原文由 Lenny 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2k
2 个回答

您可以使用简单的 SELECT * FROM tempdb..sysobjects WHERE name LIKE '%AllClasses%' 搜索所有临时对象

要修复它只需运行一次:

 BEGIN TRANSACTION
    DROP TABLE #AllClasses
COMMIT TRANSACTION

如果您仍然无法删除它,只需使用 --- 检查僵尸会话并使用 KILL session_id SELECT * FROM sys.dm_exec_sessions 杀死它。

原文由 Giulio Caccin 发布,翻译遵循 CC BY-SA 3.0 许可协议

当您在提交执行之前对数据库执行繁重的查询时,会发生此错误。

例如,如果您尝试对具有数百万条记录的表进行一些分析计算的子查询,然后对其进行更新,则 tempdb 的维度会增长(由于必要的计算),直到达到最大维度,给出那个错误。

可能的解决方案是:

  • 尽可能减少段中的操作,例如对减少的行集进行更新(基于某些键)
  • 增加 tempdb 的尺寸(显然如果有足够的磁盘空间)

原文由 Alessandro C 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进