2010-07-29 83 views
1

我有一個處理SQL Server 2000中的SQL表中的排隊記錄的腳本。我現在需要添加腳本的其他實例來處理它們自己的排隊子集記錄在表中。在SQL Server 2000中處理記錄的可重複子集表

如何查詢每個實例中的表,以便每個實例都將返回一組永不重疊的行?

我可以在一個進程中查詢奇數行的id行,甚至可以在另一個進程中查詢偶數,但我最終需要添加兩個以上的實例。

CREATE TABLE requests (
    id int IDENTITY(1,1) NOT NULL, 
    requestor VARCHAR(50), 
    status INT, 
    created DATETIME, 
    queuetime DATETIME 
) 

的單個實例現有的查詢是:

SELECT * FROM requests WHERE status = 1 ORDER BY queuetime 

回答

1

基礎的,在你的奇/偶的解決方案,它聽起來就像是無關緊要的請求進行處理何種順序。所以,也許你可以做這樣的事情。

SELECT id, requestor, status, created, queuetime 
FROM requests 
WHERE status = 1 
    AND ID % 3 + 1 = 2 
ORDER BY queuetime 

在第二個條件中的3表示進程的數量。數字2表示第二個過程。

+0

這看起來像它會工作。不管進程的數量如何,第二個條件中的數字1是不變的? – Dave 2010-07-29 17:13:12

+0

是的,數字1是一個常數。 – bobs 2010-07-29 17:19:01

1

聽起來好像你想要2+處理器從requests表中獲取記錄。

您是否可以在requests表中添加一列以表明它已被處理?換句話說,你需要保持已被「取走」的軌跡,並且它已經「完成」了。也許在這種情況下完成,可能是你正在刪除表中的記錄。 因此,考慮簡單地添加一個像ProcessingOn DATETIME列。

通過這種構造,您可以讓每個處理器SELECT成批處理,但當然要確保它不會採用任何已處於「正在處理」狀態的處理器。

BEGIN TRAN 

DECLARE @RecordsToProcess TABLE (ID int) 

--grab our candidates 
INSERT INTO @RecordsToProcess (ID) 
    SELECT ID FROM requests WHERE status = 1 
    AND ProcessingOn IS NULL ORDER BY queuetime 

--mark our batch of records as 'in-process'. 
UPDATE requests SET ProcessingOn = CURRENT_TIMESTAMP 
WHERE ID IN (SELECT ID FROM @RecordsToProcess) 

--get all those records to process. 
SELECT * FROM requests 
WHERE ID IN (SELECT ID FROM @RecordsToProcess) 


COMMIT TRAN 

您可能會遇到批處理失敗的情況。在這種情況下,記錄不會被刪除,但它們的ProcessingOn不爲空。也許在SELECT中設置一個重試寬容,由此可以使用一個閾值(可能需要5分鐘,或者1天,無論您需要什麼)來判斷這些記錄是否需要重新處理。

--grab our candidates 
INSERT INTO @RecordsToProcess (ID) 
    SELECT ID FROM requests WHERE status = 1 
    AND (ProcessingOn IS NULL OR ProcessingOn < DATEADD(day, -1, ProcessingOn) 
    ORDER BY queuetime