簡體   English   中英

如何標記在mssql中讀取的記錄

[英]how to mark records that are read in mssql

我創建了一個系統,每天通過SMS向我們的客戶發送一些信息。 由於發送SMS的過程可能需要一段時間,這是由多個進程完成的,每個進程都發送有限數量的SMS。 當某個進程讀取大量pohne nuber記錄(比如說其中的1000個)以發送短信時。 我想將這1000條記錄標記為其他進程也不會讀取這些記錄。

Select Top(1000) ID, Number from Phones where isactive = 1 and isverified = 1

我需要一些執行以下操作的代碼:

update Phones, set ReadTime = getdate() where (上面選擇)

現在我想將這些記錄的ReadTime列更新為getdate() ,以確保其他調度進程不會再次讀取它們(我設置日期時間標記而不是位標記的原因是某些SMS發送可能會失敗這樣一來,我就可以了解哪些內容是很久以前讀取的,但沒有更新發送時間)

發送短信后標記它們(無論如何都要寫發送時間)將無濟於事,因為將處理發送SMS的計划任務將一次讀取所有1000條記錄,並且可能還有其他進程讀取的記錄但尚未被標記(因為SMS尚未發送)。

您應該能夠執行以下操作:

UPDATE Phones
SET ReadTime = GetDate()
WHERE ID IN (SELECT Top 1000 ID
             FROM Phones
             WHERE IsActive = 1
                 AND IsVerified = 1
                 AND ReadTime Is Null -- you will want to exclude any records already updated
             ORDER BY ID) 

參見帶有演示的SQL Fiddle

可能您可以在表中添加一個額外的列,該列包含進程ID的ID。 然后,您可以在每個過程中進行調用:

UPDATE Phones
SET ReadTime = GetDate(),
ProcessId = "Process0001" --or whatever the process ID is
WHERE ID IN (SELECT Top 1000 ID FROM Phones WHERE IsActive = 1 AND IsVerified = 1
                 AND ProcessId IS NULL AND ReadTime IS NULL) 

然后,使用您的進程ID調用所有記錄。 最后,您從表中刪除進程ID。

您可以一次性選擇並輸出行。 這將確保選擇的行與更新的行相同,選擇的答案將失敗。

;with a
as
(
select top 1000 readtime, id, number from @phones 
where isactive = 1 and isverified = 1 
and readtime is null
)
update a
set Readtime = getdate()
output deleted.ID, deleted.Number

暫無
暫無

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

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