[英]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.