SQL सर्वर आउटपुट क्लासर स्केलर चर में


134

क्या ऐसा करने का कोई "सरल" तरीका है या मुझे "OUTPUT ... INTO" सिंटैक्स के साथ तालिका चर द्वारा पास करने की आवश्यकता है?

DECLARE @someInt int

INSERT INTO MyTable2(AIntColumn)
OUTPUT @SomeInt = Inserted.AIntColumn
VALUES(12)

जवाबों:


161

आपको एक तालिका चर की आवश्यकता है और यह यह सरल हो सकता है।

declare @ID table (ID int)

insert into MyTable2(ID)
output inserted.ID into @ID
values (1)

45
लेकिन फिर मुझे "SIDIInt = ID FROM @ID सेलेक्ट करना होगा"। मैं जानना चाहता था कि क्या इसके अतिरिक्त उस चरण (और मध्यस्थ तालिका चर) को छोड़ना संभव है अगर मुझे ज़रूरत है तो परिणामी इंट।
बेनोइट्र

@Benoittr - यह इस बात पर निर्भर करता है कि आप किस तरह से मूल्य का उपयोग करने जा रहे हैं, यह आवश्यक नहीं हो सकता है, आप किसी चयनित कथन के खंड से तालिका का उपयोग कर सकते हैं। जब आप एक चर असाइन करते हैं तो आपको यह भी सुनिश्चित करने की आवश्यकता होती है कि सम्मिलित केवल एक पंक्ति सम्मिलित करें। और अगर इन्सर्ट केवल एक पंक्ति को सम्मिलित करता है, तो शायद मानों को क्लॉज करने में उपयोग किए जाने के बजाय सीधे पकड़ना आसान हो जाता है output?
मिकेल एरिकसन

4
ऑटो-जनरेट वैल्यू के मामले में समय (पहचान, गणना किए गए कॉलम) से पहले मूल्यों को जानना हमेशा संभव नहीं होता है। मैं समझता हूं कि कई वर्कअराउंड हैं। फिर भी, आपने मुझे वह उत्तर दिया जिसकी मुझे तलाश थी। धन्यवाद
Benoittr

एक नियमित चर में इसकी आवश्यकता है? DECLARE @InsertedIDResults TABLE (ID int); INSERT INTO MyTable (Name, Age) OUTPUT INSERTED.ID INTO @InsertedIDResults VALUES('My Name', 30); DECLARE @InsertedID int = (SELECT TOP 1 ID FROM @InsertedIDResults);
बोवेन

30

एक साल बाद ... यदि आपको किसी मेज की ऑटो जेनरेट की गई आईडी मिलनी चाहिए, तो आप कर सकते हैं

SELECT @ReportOptionId = SCOPE_IDENTITY()

अन्यथा, ऐसा लगता है कि आप एक तालिका का उपयोग करने के साथ फंस गए हैं।


6
मैं जिस चर की तलाश कर रहा था वह वास्तव में कुछ और था फिर पहचान स्तंभ। फिर भी, उत्तर के लिए धन्यवाद।
बेनोइट्र

26
जाहिरा तौर पर यह एक मल्टी प्रोसेसर समानांतर योजना में समस्या है, और OUTPUT एकमात्र हमेशा भरोसेमंद तरीका है।
andrewb

6
SCOPE_IDENTITY () कुछ वापस कर सकता है भले ही पिछले INSERT ने कुछ भी सम्मिलित न किया हो, है ना? इससे कुछ मामलों में यह बेकार हो जाएगा।
पैट्रिक होनोरेज़

2
आउटपुट क्लॉज का उपयोग करने के लिए बेहतर है
क्ले स्मिथ

1
2008 @ R2 SP1 में बग @andrewb संदर्भित है ।
adam0101

6

वे बाद में लेकिन अभी भी ध्यान देने योग्य है कि आप एक UPDATE के SET क्लॉज में या किसी SELECT के क्षेत्र में आउटपुट मान के लिए चर का उपयोग कर सकते हैं;

DECLARE @val1 int;
DECLARE @val2 int;
UPDATE [dbo].[PortalCounters_TEST]
SET @val1 = NextNum, @val2 = NextNum = NextNum + 1
WHERE [Condition] = 'unique value'
SELECT @val1, @val2

@ Val1 से ऊपर के उदाहरण में पहले मूल्य है और @ val2 के बाद का मूल्य है, हालांकि मुझे संदेह है कि ट्रिगर से कोई भी परिवर्तन val2 में नहीं होगा, इसलिए आपको उस मामले में आउटपुट तालिका के साथ जाना होगा। किसी भी चीज़ के लिए, लेकिन सबसे सरल मामले में, मुझे लगता है कि आउटपुट तालिका आपके कोड में भी अधिक पठनीय होगी।

यदि आप किसी स्तंभ को अल्पविराम से अलग की गई सूची में बदलना चाहते हैं तो यह एक जगह बहुत मददगार है;

DECLARE @list varchar(max) = '';
DECLARE @comma varchar(2) = '';
SELECT @list = @list + @comma + County, @comma = ', ' FROM County
print @list

धन्यवाद! यह वह जानकारी थी जिसकी मुझे आवश्यकता थी
विझौ

1
वाह! मुझे नहीं पता था कि आप कर सकते हैं SET @val2 = NextNum = NextNum + 1
सैम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.