2016-01-26 58 views
-2

我創建一個股市數據庫,並很爲難,下面的工作正常,只是最後選擇返回結果(在此之後,選擇不會對後續循環改變)。我試圖簡化代碼如下,提前爲反饋謝謝(我還是小白):SQL服務器:While循環嵌套如果

三個表:

  • BuyOrders
  • SellOrders
  • MatchedOrders

處理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; 
+4

這看起來並不像MS SQL服務器 - 是一些僞代碼,還是你用錯誤的服務器標籤標籤呢? – Luaan

+2

我對格式不太熟悉,我們在看僞代碼嗎?如果沒有,這是什麼SQL服務器?我沒有看到任何範圍(開始/結束)在哪裏,而我也沒有看到你選擇進入哪個範圍。如果這是MSSQL,是NewBuyOrder的CLR UDF還是什麼? –

+0

發佈是僞代碼,因爲(我使用SQL Server 2008) - 我一直希望有一個與在/打破一些明顯的錯誤/繼續。 。 。如果不是,我可以發佈整個300行。 –

回答

0

希望它可以幫助別人,我發現了這個問題。 。 。我使用本地變量來存儲匹配的SellOrderID。因此,如果Select在第二次通過時沒有返回匹配,那麼局部變量沒有得到更新(因此在隨後的while循環中錯誤地重用,直到If被踢入)。

所以我把SET SellOrders.ID = 0放到WHILE循環之前,然後在Select下面選擇添加了一個IF SellOrders.ID = 0並且在那裏SET NewBuyOrder.SharesRemaining = 0和BREAK(然後第一個IF如上)進入ELSE IF)。

我需要重新審視的過程,看看我是否可以使它更優雅,但會在更好的方式真誠歡迎想法實現的過程按順序匹配最好的還價。我讀過,但不很瞭解光標,加上認爲它優於事務不選擇所有的比賽,而不是用我的迭代循環的優先表 - 而且已經閱讀建議不要在SQL中使用循環。註釋?


另外我注意以下幾點:本身選擇一個沒有結果的選擇返回一個空集。因此,我原來的計劃是選擇到我的SP本地變量,然後使用IF EXISTS。我認爲在實例中的局部變量存在(甚至沒有任何價值),但是很奇怪,之後選擇與沒有結果的局部變量也沒有失敗的IF NULL測試(即假定NULL不能插入變量)。那麼什麼是沒有值的實例化局部變量的值 - Blank?