2012-02-26 19 views
7

ठीक है तो यहां एक त्वरित SQL प्रश्न (एसक्यूएल-सर्वर-2008 का उपयोग करके)।एसक्यूएल का चयन करें या वापसी आईडी

मैं मुझे क्या करना चाहते हैं पहले SELECT [ID] FROM [names] WHERE [DisplayName] = 'chuck';

है लेकिन, अगर नाम 'चक' में मौजूद नहीं है निम्न स्तंभ

IDDisplayName

के साथ एक मानचित्रण तालिका names है डेटाबेस, मैं इसे बनाना चाहता हूं, और ऑटो incremented ID वापस करना चाहता हूं।

मैं सोच रहा था कि क्या एसक्यूएल ने इसे आसान तरीके से करने के तरीके में बनाया है, या अगर मुझे लंबा रास्ता तय करना है? इस

SELECT COUNT(ID) AS count, ID FROM names WHERE DisplayName='chuck' 
IF(count > 0) 
    SELECT ID as ReturnID; 
ELSE 
    BEGIN 
    INSERT INTO names(DisplayName) values('chuck'); 
    SELECT scope_identity() as ReturnID; 
    END 

तरह

लंबे मार्ग कुछ किया जा रहा है मुझे लगता है कि पिछले बयान का परीक्षण नहीं किया, लेकिन मुझे लगता है लंबा रास्ता तय करना ऐसा ही कुछ होगा। यदि कोई रास्ता नहीं बनाया गया है, तो मैं इसकी सराहना करता हूं अगर कोई उस कथन को सही कर सकता है (जैसा कि मुझे यकीन है कि यह पूरी तरह से सही नहीं है)।

+3

यदि केवल 200 * + का समर्थन करते हैं, तो [MERGE वाक्यविन्यास] का उपयोग करें (http://technet.microsoft.com/en-us/library/bb510625.aspx) –

+0

क्या आप एक उदाहरण प्रदान कर पाएंगे? मैं एसक्यूएल का उपयोग करने के अधिक उन्नत तरीकों को सीखने की कोशिश कर रहा हूं। –

+0

@ केल्टन 52: लेख ओएमजी टट्टू से जुड़े लेख के अंत में उदाहरण हैं। आपको थोड़ा नीचे स्क्रॉल करने की आवश्यकता है। –

उत्तर

4

साथ ही आप लेनदेन के बारे में ध्यान रखना चाहिए:

set XACT_ABORT on 
begin tran 

declare @ID int 

select @ID = ID from names with (holdlock, updlock) WHERE DisplayName='chuck' 

if @@rowcount = 0 
begin 
    INSERT INTO names(DisplayName) values('chuck'); 
    set @ID = scope_identity(); 
end 

select @ID as ReturnID; 

commit tran 

नोट तालिका संकेत का उपयोग - holdlock और अपडेटलॉक। वे एक और धागे को एक ही प्रश्न को निष्पादित करने और पंक्ति को दूसरी बार बनाने से रोकते हैं। अधिक जानकारी के लिए अलगाव, सिंक्रनाइज़ेशन, डेडलॉक्स, समवर्ती अद्यतनों की तलाश करें।

+0

ठीक है, तो यह चला गया और अब टेबल deadlocked ... कोई विचार? –

+0

आप भी वहां से दो बार हैं, मानते हैं कि –

+0

भी एसक्यूएल xac_abort –

0

मुझे क्या करना होगा:

IF (NOT EXISTS(SELECT null from names where DisplayName='Chuck')) 
    INSERT INTO Names (DisplayName) Values ('Chuck') 

SELECT ID as ReturnID FROM Names where DisplayName='Chuck' 

बचाने नहीं करता है ज्यादा हालांकि

+0

क्या यह 2 प्रश्नों को निष्पादित करने वाला सबसे अच्छा नहीं है, और सबसे खराब, 1 क्वेरी निष्पादित करना? – crush

संबंधित मुद्दे