SQL-在不使用游标的情况下需要一些帮助吗

SQL-在不使用游标的情况下需要一些帮助吗,sql,cursor,Sql,Cursor,目前,在我的存储过程中,我正在使用光标处理以下情况。我所知道的是我们需要尽可能避免使用游标 所以,我把情况发到这里,你可以帮我解决它 在表A中,我使用游标逐个获取用户ID 对于每个用户ID,我调用2个函数来处理业务。结果是2个字符串 这两个字符串将保存到表B中 如果成功,则执行两个操作:更新表A中的状态=1,并返回一条消息 如果失败,执行1个操作:返回消息 循环光标 对于步骤2-5中的业务,我们如何使用游标创建存储过程 我希望你能给我一些建议来解决这个问题。谁说你需要避免使用游标? 提供游标是有

目前,在我的存储过程中,我正在使用光标处理以下情况。我所知道的是我们需要尽可能避免使用游标

所以,我把情况发到这里,你可以帮我解决它

  • 在表A中,我使用游标逐个获取用户ID
  • 对于每个用户ID,我调用2个函数来处理业务。结果是2个字符串
  • 这两个字符串将保存到表B中
  • 如果成功,则执行两个操作:更新表A中的状态=1,并返回一条消息
  • 如果失败,执行1个操作:返回消息
  • 循环光标
  • 对于步骤2-5中的业务,我们如何使用游标创建存储过程


    我希望你能给我一些建议来解决这个问题。

    谁说你需要避免使用游标?
    提供游标是有原因的,在某些情况下,您必须使用游标或使用某种编程语言获取记录并处理逻辑


    如果希望在数据库中,甚至在存储过程中,每个记录都成功或失败,则需要一个游标。(是的,有insert after触发器,但这会使您的逻辑复杂化)

    在较高的级别上,您可以执行类似的操作(我在表B中添加了insertDate,因为我认为更新是必要的)

    首先,将表A中的数据插入表B:

    insert into tableB (ID, column1, column2, insertDate)
    select ID, callFunction1(userID), callFunction2(userID), getdate()
    
    然后,对于插入的记录,设置status=1

    update tableA
    set status=1 
    where ID in (select ID from tableB where insertDate=today)
    
    现在,返回消息的种类有点复杂,您不能每行返回一条消息,如果其中任何一条消息“失败”,整个批将失败


    在您的案例中,什么会导致故障?

    您使用的是哪种DBMS?Sql Server?第(4)项中的“如果成功”是什么意思?请包括您当前使用的代码。迭戈:是的,是Sql Server 2008。Grisha:“如果成功”是指成功保存到表B中的那两个字符串。戴姆斯:如果可能的话,我只想找到一个解决方案。事实上,我的存储过程非常长且复杂。谢谢大家的回复。好吧,从你的伪代码看来,你从来没有使用过一次以上的循环迭代-步骤4-5在任何情况下都会退出循环…是的,你的解决方案对我参考非常有帮助。我将尝试在存储过程中应用它。谢谢你的帮助。目前,我的表有大约10.000.000条记录。如果我将游标用于业务,此表将锁定,没有人可以使用它。所以,我问这个问题是为了寻找一些解决方法。谢谢