【发布时间】:2015-06-08 19:33:55
【问题描述】:
我继承了维护一个通过 SQL 代理作业每晚执行的存储过程。它已经运行好几个月了,但突然间昨晚运行重复了一些工作并错过了一些工作。
作业在半夜运行,此时没有用户。我从有问题的运行之前将数据库的备份恢复到测试服务器,重新运行该过程,一切正常。它也是小数据,可能每晚 100-200 行。
这是遇到问题的过程中的循环之一的表示:
DECLARE @uniqueId int
DECLARE @examId int
DECLARE @TempSingleContactTable TABLE
(
uniqueId int IDENTITY(1,1) PRIMARY KEY,
examId int not null,
contactEmail nvarchar(max) null,
)
[data inserted into @TempSingleContactTable]
WHILE EXISTS (SELECT * FROM @TempSingleContactTable)
BEGIN
Select top 1 @uniqueId = uniqueId,
@examId = examID, from @TempSingleContactTable
[*****PROBLEM HERE- this line with same value for @examId ran multiple times, but eventually continued]
DELETE FROM @TempSingleContactTable WHERE examID = @examId
END
我能看到的唯一可能导致上述问题的是如果 DELETE 调用不起作用。对表变量的 DELETE 调用是否可能不是即时的?
编辑: 非常感谢有关可能导致从 @TempSingleContactTable 中删除偶尔失败的任何信息。
编辑 2: 进一步的调查表明,这种每晚一次的自动化程序在两个月内以同样的方式失败了两次。有趣的是,每次失败时,前一天晚上的运行都没有改变任何数据,而且总是如此。不幸的是,没有日志信息可以确定可能导致前几晚出现问题的原因。看起来他们必须是相关的,尽管它可能是一个红鲱鱼。我添加了日志记录,希望能找到真正的根本原因。
【问题讨论】:
-
为什么在你的 delete 语句中使用
@examId作为你的 where 条件,而不能保证它是唯一的?@uniqueId是更好的候选者,因为它是您的主键。 -
@Kritner,因为在该循环中完成的工作应该只针对每个考试 ID 发生一次,并且具有相同考试 ID 的单个联系人可能有多个记录。
标签: sql sql-server sql-server-2014