在循环中使用select设置变量的最佳实践

时间:2016-06-07 18:26:40

标签: sql loops variables

我目前正在尝试修复存​​储过程中的错误,每隔一段时间(每月一次),我会发现一个子记录最终出现在错误的父帐户上,原因是两者之间存在同步错误两个系统。查看代码,我相信我已经找到了问题。我看到的问题是,在一个循环中,每个子记录的父帐户都使用select语句设置,如果查询不返回任何结果,用于分配accountid和accountname的变量将保留前一个循环中的信息周期。至于为什么循环周期找不到相关记录,这完全是另一个问题,我还没有解决的间歇性问题。考虑到这一点,我不认为这种设置变量的方法是个好主意!有什么办法可以验证或确认变量是否设置正确,如果没有,是否考虑处理该记录?任何帮助,建议或智慧的话都非常感激!

这是一个代码示例,它在循环内运行以设置变量。 @id是将在循环周期中处理的当前子对象id。

toList = function(x) x[[1L]]

感谢大家的投入。每个人都提供了有价值的反馈,我很抱歉没有提供更多可以提供更精确解决方案的脚本。我决定使用的是检查将在变量赋值中使用的表,确认帐户数据是否存在,并且仅将这些子记录添加到集合中以进行循环。仍有一个问题是数据从点a(添加到集合)变为点b(变量赋值),但我会以某种方式控制表,因为这些表不是非常活跃,而且我在大多数情况下都有唯一访问它们。再次感谢!

3 个答案:

答案 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