我使用的是Microsoft SQL Server 2014,并且在尝试创建临时表时遇到了一些问题。我之前运行过这段代码没有任何问题,但是当我今天尝试运行查询时,我收到了两个错误之一"已经有一个名为' #AllClasses'在数据库"或"数据库' 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 Classes'因为它不存在或您没有权限。"
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;
我可以毫无问题地运行其他查询。任何修复此特定查询的建议都将不胜感激。
答案 0 :(得分:3)
您可以使用简单的SELECT * FROM tempdb..sysobjects WHERE name LIKE '%AllClasses%'
来搜索所有临时对象
修复它只需运行一次:
BEGIN TRANSACTION
DROP TABLE #AllClasses
COMMIT TRANSACTION
如果您仍然无法删除它,只需检查SELECT * FROM sys.dm_exec_sessions
的僵尸会话并使用KILL session_id
将其删除。
答案 1 :(得分:3)
在提交之前在数据库上执行繁重的查询时,会发生此错误。
例如,如果您尝试对具有数百万条记录的表进行一些分析计算的子查询,然后对其进行更新,则tempdb的维数会增加(由于必要的计算),直到达到最大值为止。尺寸,并给出该错误。
可能的解决方案是:
答案 2 :(得分:0)
关于表丢弃问题,当嵌套过程调用的临时表与调用过程中的临时表同名时,我似乎会发生这种情况。
我也偶尔会看到一些孤立的spid,其中临时表是一种僵尸状态,当你检查objectid时它并不匹配。如果它是前一个问题,只需重命名临时表
我还会检查活动spid,看看是否有任何挂起的事务也可能是事务日志问题的原因,然后杀死它们。视图为sys.dm_exec_sessions
,以查看正在运行的内容。
答案 3 :(得分:0)
对我来说,与数据库断开连接(在对象资源管理器中右键单击它-断开连接),然后重新连接再次解决了该问题。
答案 4 :(得分:0)