2013-05-30 6 views
43

में अद्यतन आउटपुट को अद्यतन करें, मैं एक अद्यतन और चयन करने की कोशिश कर रहा हूं ... मूल रूप से, एक इंडेक्स के आधार पर अद्यतन करें, और उसके बाद अपडेट की गई पंक्ति आईडी का चयन करें।एक चर

इस उत्पादन खंड का उपयोग कर सरल है:

UPDATE Foo 
SET Bar = 1 
OUTPUT INSERTED.Id 
WHERE Baz = 2 

लेकिन अब, कैसे मैं इस एक चर में मिलता है?

DECLARE @id INT 

ये तीन काम नहीं करते:

UPDATE Foo 
SET Bar = 1 
OUTPUT @id = INSERTED.Id 
WHERE Baz = 2 

SET @id = 
(UPDATE Foo 
SET Bar = 1 
OUTPUT INSERTED.Id 
WHERE Baz = 2) 

SET @id = 
(SELECT Id FROM (UPDATE Foo 
       SET Bar = 1 
       OUTPUT INSERTED.Id Id 
       WHERE Baz = 2) z) 

पिछले एक शामिल ऐसा इसलिए है क्योंकि यह मुझे अस्थायी रूप से उत्साहित था जब सभी लाल squigglies प्रबंधन स्टूडियो में चला गया। अफसोस, मैं इस त्रुटि मिलती है:

A nested INSERT, UPDATE, DELETE, or MERGE statement is not allowed in a SELECT statement that is not the immediate source of rows for an INSERT statement. 

उत्तर

44

यदि केवल एक पंक्ति प्रभावित होती है, तो इसे तालिका चर के बिना किया जा सकता है।

DECLARE @id INT 

UPDATE Foo 
SET Bar = 1, @id = id 
WHERE Baz = 2 

SELECT @id 
+1

मैं भी इस बात का कभी नहीं सोचा है। बहुत अच्छा! –

+1

धन्यवाद कॉरी, मुझे आश्चर्य हुआ कि अद्यतन के अंदर सेट कीवर्ड एक चर सेट करने में सक्षम होगा और यह काम करता है! –

+0

यह काम एक ही प्रभावित पंक्ति के लिए 'insert' के साथ करेगा? – rahoolm

62

एक अद्यतन एकाधिक पंक्तियों प्रभावित कर सकता है, यह एक मेज की आवश्यकता है उसके परिणामों स्टोर करने के लिए: क्या आप वाकई केवल एक पंक्ति प्रभावित हो जाएगा रहे हैं

declare @ids table (id int); 

UPDATE Foo 
SET Bar = 1 
OUTPUT INSERTED.Id INTO @ids 
WHERE Baz = 2 

, आप आईडी को बाहर खींच सकते हैं जैसे:

declare @id int 
select top 1 @id = id 
from @ids 
1

वैकल्पिक रूप से, अगर केवल एक पंक्ति प्रभावित हो रहा है:

DECLARE @id INT 

UPDATE Foo 
SET @id = Bar = 1 ---Yes, this is valid! 
WHERE Baz = 2 

SELECT @id