Sql server SQL Server:带有嵌套If的While循环

Sql server SQL Server:带有嵌套If的While循环,sql-server,if-statement,while-loop,Sql Server,If Statement,While Loop,我正在创建一个股票市场数据库,我被难倒了,除了返回结果的最后一个select之外,下面的操作是否正确,在随后的循环中select没有改变。我已经尝试将代码简化如下,提前感谢您的反馈,我仍然很忙: 三张表: 买单 销售订单 配对顺序 处理NewBuyOrder的存储过程: Insert NewBuyOrder to BuyOrders; While (NewBuyOrder.SharesRemaining > 0 ) SELECT TOP 1 FROM Se

我正在创建一个股票市场数据库,我被难倒了,除了返回结果的最后一个select之外,下面的操作是否正确,在随后的循环中select没有改变。我已经尝试将代码简化如下,提前感谢您的反馈,我仍然很忙:

三张表:

买单 销售订单 配对顺序 处理NewBuyOrder的存储过程:

 Insert NewBuyOrder to BuyOrders;

 While (NewBuyOrder.SharesRemaining > 0 )

      SELECT TOP 1 
      FROM SellOrders 
      WHERE SellOrders.Price <= NewBuyOrder.Price
      ORDER BY SellOrders.Price, SellOrders.TimePlaced;

      IF NewBuyOrder.SharesRemaining < SellOrders.SharesAvailable 
         UPDATE SellOrders.SharesAvailable = [difference];
         UPDATE BuyOrders = 0;

         INSERT INTO MatchedOrders;

         SET NewBuyOrder.SharesRemaining = 0;
         BREAK;

     ELSE
         UPDATE SellOrders = 0;
         UPDATE BuyOrders = [difference];

         INSERT INTO MatchedOrders;

         SET NewBuyOrder.SharesRemaining = [difference];
         CONTINUE;

希望它能帮助其他人,我发现了这个问题。我使用局部变量来存储匹配的SellOrderID。同样地,如果Select在第二次传递时没有返回匹配,则局部变量没有得到更新,因此在随后的while循环中错误地重复使用,直到if启动

因此,我将一组SellOrders.ID=0放入WHILE循环中,在Select之前,然后在Select下面添加了一个IF SellOrders.ID=0,在该循环中,一组NewBuyOrder.SharesRemaining=0,然后BREAK将上面的第一个IF转换为ELSE IF

我需要重新审视这个过程,看看是否可以让它变得更优雅,但我真诚地欢迎大家思考如何更好地完成一个过程,以便依次匹配最好的还价。我读过但不太了解游标,并且认为不选择所有匹配项的优先表而不是使用迭代循环在事务上更优越,但也有阅读建议不要在SQL中使用循环。评论


此外,我注意到以下几点:没有结果的Select本身返回空集。因此,我最初的计划是选择SP局部变量,然后使用IF EXISTS。我假设局部变量在实例化时存在,即使没有值,但令我惊讶的是,在对局部变量进行选择之后,如果没有结果,那么IF NULL测试也没有失败,即假定NULL不能插入到变量中。那么,没有值的实例化局部变量的值是多少?空白?

看起来不像MS SQL server-是伪代码还是您用错误的服务器标记标记了它?我对格式不太熟悉,我们是在看伪代码吗?如果不是,这是用于什么SQL server的?我看不到关于where的任何范围界定的开始/结束,也看不到您正在选择什么来进入前1名。如果这是MSSQL,NewBuyOrder是CLR UDF还是什么?发布的是伪代码,因为我使用的是SQL Server 2008-我希望While/Break/Continue有一些明显的错误。如果不是的话,我可以发布整个300行。没有什么会立即跳出你的循环错误。可能需要在psuedocode之外发布完整的代码,以查看是否还有其他错误。您还应澄清“最后可行选择”的含义