2009-03-20 14 views
6

एमएसडीएन दस्तावेज़ इस पर पूरी तरह स्पष्ट नहीं थे। या शायद मैं उन्हें काफी अच्छी तरह से पढ़ नहीं रहा हूँ।यदि कोई प्रविष्टि विफल होने के बाद मैं SCOPE_IDENTITY() का चयन करता हूं तो क्या होता है (SQL सर्वर 2005)

अगर मैं एक (शून्य पंक्तियां सम्मिलित हो सकता है) डालने, द्वारा

;SELECT SCOPE_IDENTITY() 

और फिर पीछा ExecuteScalar() द्वारा आदेश फोन ...

क्या परिणाम अगर सम्मिलित हो जाएगा करना कोई पंक्ति नहीं डालता है?

अगर मैं विफल रहता हूं तो मैं इसे रोकना चाहता हूं ताकि मैं खराब रिकॉर्ड, या गलत पैरेंट आईडी में बाल रिकॉर्ड डालने पर जारी नहीं रहूं।

+1

समानांतर निष्पादन बग कि SCOPE_IDENTITY के लिए एसक्यूएल सर्वर में मौजूद है और @@ के बारे में मत भूलना पहचान: http://support.microsoft.com/default.aspx?scid=kb;en-US;2019779 –

उत्तर

11

यदि कोई पहचान डाली गई है तो SCOPE_IDENTITY() शून्य वापस आ जाएगी, तो आप एक चर के लिए SCOPE_IDENTITY() असाइन करके और फिर चर सामग्री को जांचकर निर्दिष्ट शर्त की जांच कर सकते हैं।

चित्रण

Create Proc SomeInsertToFail(@ID int OUTPUT) 
as 
Begin 
    Select @ID = Scope_Identity() 
End 
Declare @SOMEID int 
Exec SomeInsertToFail @SOMEID OUTPUT 
Select @SOMEID --This will yield null 
+0

तो क्या मैं चयन IsNull (Scope_Identity(), -1) कर सकता हूं ताकि मुझे हमेशा एक वैध आईएनटी मिल सके और असफल मान वास्तविक आईडी नहीं हो सकता है? (निश्चित रूप से मेरी पहचान 1 से शुरू होती है) –

+3

कुछ और गूढ़ परिदृश्यों पर परीक्षण के लायक हो सकता है ... एक टेबल पर INSERT जहां एक ट्रिगर अखंडता बनाए रखता है और डालने से रोकने के लिए त्रुटि उत्पन्न करता है ... – MatBailie

+0

@Dems, यह एक दिलचस्प है परीक्षण, मैं इसे आज़मा दूंगा। –

3

शून्य

स्रोत: था एक का चयन करें SCOPE_IDENTITY() एक खाली क्वेरी पर (उर्फ नहीं डालने)

3

यह पर है कि क्या वहाँ के भीतर एक सफल डालने कर दिया गया है निर्भर करता है वर्तमान दायरा

declare @tb table (i int identity, ky varchar(100)); 

insert into @tb values('Success'); 

insert into @tb select ky from @tb where ky = 'Failure'; 

select SCOPE_IDENTITY(); -- returns 1 
select * from @tb 
संबंधित मुद्दे