2017-07-24 1106 views
0

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

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类’,因为它不存在或您没有权限。“

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

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

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; 

我能够运行其他查询没有问题。任何建议来解决这个特定的查询将不胜感激。

+1

可能重复[数据库的事务日志已满](https://stackoverflow.com/questions/17674973/the-transaction-log-for-the-database-is-full) –

+0

@GiulioCaccin谢谢对于这个建议,但是我对事务日志运行了一个查询,用于tempdb的日志空间只有31%。您提到的另一个查询也无助于理解为什么我创建的临时对象拒绝被删除或创建。除非我的建议中缺少某些东西。 – Lenny

回答

1

您可以搜索所有的临时对象用一个简单的SELECT * FROM tempdb..sysobjects WHERE name LIKE '%AllClasses%'
要修复它只是运行一次:

BEGIN TRANSACTION 
    DROP TABLE #AllClasses 
COMMIT TRANSACTION 

如果仍然无法删除它只是检查僵尸会议与SELECT * FROM sys.dm_exec_sessionsKILL session_id杀死它。

0

关于表格放置问题,当嵌套过程调用在调用过程中具有与临时表名称相同的临时表时,似乎会发生这种情况。
我也偶尔会看到孤立的spids,其中临时表是僵尸状态,并且在检查objectid时不匹配。如果以前的问题只是重命名临时表。
我也会检查活动的spid,看看是否有任何挂起的事务也可能是事务日志问题的原因,然后杀掉它们。该视图是sys.dm_exec_sessions以查看正在运行的内容。

相关问题