2011-04-20 20 views
8

मेरे पास स्टेटस कॉलम वाले तालिका में कई रिकॉर्ड हैं और मैं एक रिकॉर्ड चुनना चाहता हूं जहां स्थिति = लंबित और उसी परमाणु क्वेरी चिह्न में यह स्थिति = InProcess के रूप में। ऐसा करने का सबसे अच्छा तरीका क्या है?डेटाबेस से रिकॉर्ड का चयन कैसे करें और इसे परमाणु क्वेरी में अपडेट करें

यह आवश्यक है क्योंकि एक ही समय में इन रिकॉर्ड्स को संसाधित करने की कोशिश कर रहे कई प्रश्न चल रहे हैं और मैं नहीं चाहता कि दो धागे प्रक्रिया के लिए एक ही रिकॉर्ड उठा रहे हों।

उत्तर

13

आप आउटपुट खंड का उपयोग कर सकते हैं:

UPDATE [table] 
SET Status = 'InProcess' 
OUTPUT deleted.* 
WHERE Status = 'Pending' 

यहाँ आप डाला तालिका नाम का उपयोग कर सकते हैं नई स्थिति या साथ पंक्ति प्राप्त करना चाहते हैं, तो नष्ट कर दिया जब पुराने।

+1

+1। आज कुछ नया सीख लिया :)। यह – tobias86

+0

अपडेट करने से ठीक पहले रिकॉर्ड वापस करेगा। बहुत बहुत धन्यवाद। यह कमाल का है। ठीक वही जो मेरे द्वारा खोजा जा रहा था। यदि कोई दिलचस्पी लेता है तो यह SQL2005 और ऊपर में काम करता है। – lahsrah

+1

यह केवल एक रिकॉर्ड नहीं करता है हालांकि प्रश्न में निर्दिष्ट है। –

3

यह चाल

UPDATE [table] 
SET Status = 'InProcess' 
WHERE Status = 'Pending' 

एसक्यूएल 2008 आपके लिए किसी भी ताला का ध्यान रखना चाहिए करना चाहिए।

+0

मैं भी है कि रिकॉर्ड का चयन करने की जरूरत है। – lahsrah

+0

तो पहले क्या होने की आवश्यकता है? क्या आप इसे पहले चुनना चाहते हैं और फिर अपडेट करना चाहते हैं, या इसके विपरीत? – tobias86

5

यहां Using tables as Queues के बारे में एक लेख है।

इस तालिका के साथ create table T (ID int identity, Status varchar(15)) ऐसा कुछ आपको डेडलॉक्स से सुरक्षित रखना चाहिए।

;with cte as 
(
    select top 1 * 
    from T with (rowlock, readpast) 
    where Status = 'Pending' 
    order by ID 
) 
update cte 
set Status = 'InProcess' 
output inserted.ID, inserted.Status 
+1

+1 मैं '(रोलॉक, अपडेटलॉक, रीडपास्ट)' के साथ 'का उपयोग करता हूं। –

0

यह निम्न हैक की तरह है, लेकिन यह परमाणु पढ़ने/अद्यतन के लिए मेरे लिए काम किया:

declare temp1, temp2, ...; 
update table 
    set temp1=column1, 
     temp2=column2, ... 
     column1=expression1, 
     column2=expression2, ... 
where conditions; 
select temp1, temp2, ...; 
संबंधित मुद्दे