我正在创建一个股票市场数据库并且难以理解以下正常工作除了返回结果的最后一个选择(之后选择在后续循环中不会改变)。我已经尝试按如下方式简化代码,提前感谢反馈(我还是noob):
三张桌子:
处理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;
答案 0 :(得分:0)
希望它可以帮助别人,我发现了这个问题。 。 。我使用局部变量来存储匹配的SellOrderID。因此,如果Select在第二次传递时没有返回匹配,那么局部变量没有得到更新(因此在后续的while循环中错误地重用,直到If被踢入)。
所以我将一个SET SellOrders.ID = 0放入WHILE循环之前,然后在Select下面添加一个IF SellOrders.ID = 0并在其中设置一个SET NewBuyOrder.SharesRemaining = 0和BREAK(然后成为第一个IF以上进入ELSE IF)。
我需要重新审视这个流程,看看我是否可以让它更优雅,但真诚地欢迎有关更好地完成匹配最佳可用计数器的流程的想法。我已经阅读过,但对游标知之甚少,另外认为它在事务上优于不选择所有匹配的优先级表而不是使用我的迭代循环 - 但也有读取建议不要在SQL中使用循环。评论?
另外,我注意到以下内容:本身没有结果的Select返回一个空集。因此,我最初的计划是选择我的SP局部变量,然后使用IF EXISTS。我假设局部变量在实例化时存在(即使没有值)但是很惊讶在选择进入局部变量后没有结果也没有失败IF NULL测试(即假设NULL不能插入变量)。那么没有值的实例化局部变量的值是什么 - 空白?