我目前正在尝试修复存储过程中的错误,每隔一段时间(每月一次),我会发现一个子记录最终出现在错误的父帐户上,原因是两者之间存在同步错误两个系统。查看代码,我相信我已经找到了问题。我看到的问题是,在一个循环中,每个子记录的父帐户都使用select语句设置,如果查询不返回任何结果,用于分配accountid和accountname的变量将保留前一个循环中的信息周期。至于为什么循环周期找不到相关记录,这完全是另一个问题,我还没有解决的间歇性问题。考虑到这一点,我不认为这种设置变量的方法是个好主意!有什么办法可以验证或确认变量是否设置正确,如果没有,是否考虑处理该记录?任何帮助,建议或智慧的话都非常感激!
这是一个代码示例,它在循环内运行以设置变量。 @id是将在循环周期中处理的当前子对象id。
toList = function(x) x[[1L]]
感谢大家的投入。每个人都提供了有价值的反馈,我很抱歉没有提供更多可以提供更精确解决方案的脚本。我决定使用的是检查将在变量赋值中使用的表,确认帐户数据是否存在,并且仅将这些子记录添加到集合中以进行循环。仍有一个问题是数据从点a(添加到集合)变为点b(变量赋值),但我会以某种方式控制表,因为这些表不是非常活跃,而且我在大多数情况下都有唯一访问它们。再次感谢!
答案 0 :(得分:1)
我会假设子表可以返回多行
所以前1名应该更有效率
@idFound = null;
Select top 1
@AccountId = t1.AccountId,
@Account = t1.AccountName
@idFound = t1.Id
From Accounts t1
Inner Join ChildTable t2 on t2.Id = t1.Id
and t2.Id = @Id
if(@idFound <> @Id) -- did not find record
如果@AccountId和/或@Account永远不为null,您可以先分配一个空值然后检查null
答案 1 :(得分:1)
最可能的问题是查询中的空结果集。测试此方法的最简单方法是验证语句行数。您没有指定SQL风格,但大多数(如果不是全部)引擎都有一些测试行数的方法,例如,SQL Server中的@@ROWCOUNT
。
只需使用if
语句验证1行是否受到查询...
答案 2 :(得分:0)
如果您的输出有多行,则sql将最后一个值分配给varibales ..所以我建议使用表来代替..
insert into @table(
@accountid,Account)
Select t1.AccountId,
t1.AccountName
From Accounts t1
Inner Join ChildTable t2 on t1.ID = t2.ID
Where t2.Id = @Id