簡體   English   中英

SQL 根據找到的最后記錄更新或插入

[英]SQL update or insert based on last record found

快速背景:過程設備供應商編寫代碼以使用過程結果更新數據庫。 數據本質上是:(Order #, Result, Qty) 除了Qty總是1,當batch很大的時候,我得到很多相同的記錄。 供應商軟件更新不是一個選項。 供應商的數據庫更新是通過調用存儲過程完成的。

我想在存儲過程中做的是,如果特定訂單 # 的最后一條記錄與當前插入的記錄具有相同的結果,則 +1 到最后一條記錄的數量(並且沒有新記錄)。

在我的研究中,所有示例都將結果作為 Where 的一部分包含在內,它總是會組合類似的結果,但我的結果順序很重要。 如果 3 個有結果 X1,1 個有結果 X2,另外 2 個有結果 X1,那么完成后我需要 3 個記錄:

Order  Result Qty 
101    X1     3
101    X2     1
101    X1     2

我還查看了使用 cursor 的情況,但這似乎需要查看多個記錄,而我只會查看一個。 CTE 或嵌套查詢似乎是可能的,但我不清楚如何實現。

在這種情況下,我可以假設只有一台機器正在處理 1 個訂單,並且在下一次更新之前對該訂單的更新將有足夠的時間完成。 但理想情況下,解決方案應該是原子的,並且能夠處理重疊的更新請求。

我正在努力的方向,但不知道它是否是最佳路徑(傳入@p變量,@l變量用於存儲最后一條記錄):

select top(1) @lOrder = OrderCol, 
              @lResult = ResultCol,
              @lCreateDate = CREATEDATE
 from dbo.LOG
 where OrderCol = @pOrder
 order by CREATEDATE desc

-- make sure the record is no more than x min old, and every other passed value matches
if (    @lOrder = @pOrder 
    and @lResult = @pResult
    and @lCreateDate > DATEADD(minute, -7, GETDATE())
    )
     begin

        Update dbo.LOG 
        set [QtyCol] += @pQty
        where @lOrder = OrderCol
          and @lCreateDate = CREATEDATE

     end 
    else
     begin

        INSERT INTO dbo.LOG 
              ([OrderCol], [QtyCol], [ResultCol], CREATEDATE ) 
        VALUES(@pOrder, @pQty, @pResult, GETDATE());

     end

看來您需要檢查更新是否修改了行。 如果沒有則插入。 代碼用通俗易懂的語言說:“如果訂單與最近 7 分鍾內下達的訂單相匹配,請嘗試更新 LOG 表。如果沒有找到匹配項,則插入一個新行,並將 CREATEDATE 設置為當前日期。”

select top(1) @lOrder = OrderCol, 
              @lResult = ResultCol,
              @lCreateDate = CREATEDATE
 from dbo.LOG
 where OrderCol = @pOrder
 order by CREATEDATE desc;

Update dbo.LOG 
set [QtyCol] += @pQty
where OrderCol = @lOrder
      and ResultCol = @lResult
      and ResultCol = @pResult
       and CREATEDATE >= dateadd(minute, -7, getdate());
if @@rowcount=0
    insert INTO dbo.LOG([OrderCol], [QtyCol], [ResultCol], CREATEDATE ) 
        VALUES(@pOrder, @pQty, @pResult, GETDATE());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM