SQL Server 2008 का उपयोग करके IDENTITY_INSERT को चालू और बंद कैसे करें?


461

जब मुझे IDENTITY_INSERTऑफ पर सेट किया जाता है तो मुझे एक सम्मिलित करने में त्रुटि क्यों हो रही है?

मैं SQL Server 2008 में इसे ठीक से कैसे चालू करूं? यह SQL सर्वर प्रबंधन स्टूडियो का उपयोग करके है?

मैंने यह क्वेरी चलाई है:

SET IDENTITY_INSERT Database. dbo. Baskets ON

तब मुझे संदेश वापस कंसोल में मिला जिसे कमांड ने सफलतापूर्वक पूरा किया। हालाँकि जब मैं एप्लिकेशन चलाता हूं, तब भी यह मुझे नीचे दिखाई गई त्रुटि देता है:

Cannot insert explicit value for identity column in table 'Baskets' when 
IDENTITY_INSERT is set to OFF.

कृपया इस प्रश्न का विस्तार करें ताकि हम समझ सकें कि आप क्या करने की कोशिश कर रहे हैं। जब आप इस त्रुटि का सामना कर रहे हैं, और आप त्रुटि संदेश का वास्तविक पाठ क्या कह रहे हैं?
मैट गिब्सन

भले ही आपने एक और प्रश्न पूछा हो, आपको यहाँ एक उत्तर स्वीकार करना चाहिए: हमने वही उत्तर दिया जो आपने पूछा था
gbn

8
मुझे इस बात का डर है कि कोई व्यक्ति किसी एप्लिकेशन से पहचान मान भेजने का प्रयास कर रहा है। यह कुछ ऐसा नहीं है जो आपको असीम डेटा प्रवास को छोड़कर करना चाहिए। यदि आप इसे नियमित रूप से किसी एप्लिकेशन से चलाने के लिए पर्याप्त कर रहे हैं, तो आपको संभवतः अपने टेबल डिज़ाइन को फिर से देखना होगा।
HLGEM

मैं अपने SQL स्क्रिप्टेड बैकअप में इसका उपयोग कर रहा हूं। इसे पुनर्स्थापित करने के दौरान मुझे डेटा को मूल मानों के साथ एक स्वत: अंक तालिका में लोड करने दें। स्क्रिप्टेड बैकअप मुझे SQL डेटाबेस को डाउनग्रेड करने देता है। यदि मैं किसी पाठ क्षेत्र में बाइनरी डेटा संग्रहीत करता हूं तो प्रबंधन स्टूडियो की स्क्रिप्टेड बैकअप की प्राप्ति उतार-चढ़ाव वाली स्क्रिप्ट बनाती है।
जेटेरो

जवाबों:


771

MSDN के अनुसार SQL के माध्यम से

SET IDENTITY_INSERT sometableWithIdentity ON

INSERT INTO sometableWithIdentity 
    (IdentityColumn, col2, col3, ...)
VALUES 
    (AnIdentityValue, col2value, col3value, ...)

SET IDENTITY_INSERT sometableWithIdentity OFF

पूर्ण त्रुटि संदेश आपको बताता है कि क्या गलत है ...

IDENTITY_INSERT को बंद करने के लिए सेट किए जाने पर तालिका 'पहचान योग्य' में पहचान कॉलम के लिए स्पष्ट मूल्य नहीं डाल सकता।


@Beginner: आप हालांकि हैं, इसलिए त्रुटि। हमें कैसे पता चलेगा कि आप मान नहीं डालना चाहते हैं? हमारे पास केवल एक त्रुटि संदेश है
gbn

3
जब मैं DB.SaveChanges () करता हूं तो त्रुटि मेरे ऐप से होती है;
शुरुआत

5
नहीं, बस पहचान कॉलम के लिए एक मूल्य भेजना बंद करें। या इसे सेट करें यदि आप अपने ऐप में चाहते हैं यदि आप एक मूल्य भेजना चाहते हैं ..... लेकिन फिर मूल्यों को उत्पन्न करने के लिए पहचान संपत्ति के साथ एक कॉलम क्यों है? हम आपके लिए तय नहीं कर सकते
gbn

22
@Beginner: सेटिंग केवल वर्तमान सत्र में लागू होती है (इस प्रश्न के लिए कोई भी व्यक्ति जो इस ओर इशारा नहीं करता है), इसलिए आपके आवेदन को ऐसे आवेषण करने के लिए आवेदन के लिए इसे चालू करना होगा (और यह संभवत: तुरंत बारी करने के लिए सबसे अच्छा है। यह फिर से बंद हो जाता है जब इस तरह के आवेषण का समापन होता है, जैसे gbn शो)। आप बिना पहचान के स्तंभ पर एक मूल्य कैसे डाल रहे थे, यह स्पष्ट नहीं है, लेकिन शायद SQL सर्वर के पुराने संस्करणों में इसे सभी स्तंभों के साथ शामिल किया जाएगा जब स्पष्ट सम्मिलित कॉलम निर्दिष्ट नहीं होते हैं (?) जैसा कि इस्माइल सुझाव देता है।
रोब पार्कर

2
@ रब, मुझे लगता है कि आप ह्विया पॉइंट एडन हैं मैं किसी भी कोड पर व्यक्तिगत रूप से असफल कोड समीक्षा करता हूं जो कॉलम निर्दिष्ट किए बिना ना सम्मिलित करता है। एक त्रुटि पर व्यर्थ समय के अलावा, यह एक जोखिम भरा अभ्यास है और यदि स्तंभ डेटा सही तरीके से मेल नहीं खाता है, तो आप गंभीर डेटा अखंडता समस्याओं के साथ समाप्त हो सकते हैं।
HLGEM

59

मुझे एक समस्या थी जहाँ इसने मुझे IDENTITY_INSERT ON सेट करने के बाद भी इसे सम्मिलित करने की अनुमति नहीं दी।

समस्या यह थी कि मैंने कॉलम के नाम निर्दिष्ट नहीं किए और किसी कारण से यह इसे पसंद नहीं आया।

INSERT INTO tbl Values(vals)

तो मूल रूप से पूर्ण INSERT INTO tbl (cols) मान (मान)


6
उत्तर फलक में प्रश्न न पूछें।
डुक

4
इस वास्तव में क्या यह कॉलम सूची (मेज पर दोनों स्तंभों, blah) निर्दिष्ट करने के लिए मुझे चाहते थे, था
मस्लोव

36

आयात: आपको INSERTस्टेटमेंट में कॉलम लिखना होगा

INSERT INTO TABLE
SELECT * FROM    

सही नहीं है।

Insert into Table(Field1,...)
Select (Field1,...) from TABLE

सही है


2
धन्यवाद, यह बहुत उपयोगी था
जोस रोमेरो

1
यदि आपके पास दोनों तालिकाओं में समान स्तंभ हैं, तो आप इस तरह के चयन (Field1 ..) में कॉलम सूचीबद्ध किए बिना कर सकते हैं .... तालिका में सम्मिलित करें (Field1, ...) का चयन करें TABLE से ... और यदि आपके पास है सम्मिलित करने के लिए पहचान फ़ील्ड पहले करें ** SET IDENTITY_INSERT Table_name ON
user3590235

@ user3590235 यह एक जोखिम भरा अनुमान है कि कॉलम सूची समान है। मैन्युअल उपयोगकर्ता प्रश्नों के बाहर, ऐसा कभी न करें, क्योंकि मैं गारंटी देता हूं कि आप एक दिन PROD को तोड़ देंगे, जब कोई और आपके संदर्भ को अपडेट किए बिना तालिका परिभाषा को संशोधित करता है।
इलास्काकैटर

5

मुझे पता है कि यह एक पुराना धागा है लेकिन मैं अभी इससे टकरा रहा हूं। यदि उपयोगकर्ता कुछ अन्य सत्र सेट IDENTITY_INSERT चालू होने के बाद पहचान स्तंभ पर आवेषण चलाने का प्रयास कर रहा है, तो वह उपरोक्त त्रुटि प्राप्त करने के लिए बाध्य है।

आइडेंटिटी इंसर्ट वैल्यू सेट करना और बाद में इन्सर्ट डीएमएल कमांड को एक ही सेशन द्वारा चलाया जाना है।

यहां @Beginner अलग-अलग पहचान सम्मिलित कर रहा था और फिर अपने आवेदन से आवेषण चला रहा था। यही कारण है कि उन्हें नीचे त्रुटि मिली:

Cannot insert explicit value for identity column in table 'Baskets' when 
IDENTITY_INSERT is set to OFF.

0

यह तब होता है जब आपके पास एक प्राथमिक कुंजी फ़ील्ड होती है और आप एक मान डाल रहे होते हैं जो डुप्लिकेट कर रहा होता है या आपके पास INSERT_IDENTITY ध्वज सेट होता है


0

SET IDENTITY_INSERT Database.dbo.Baskets ON;हर एसक्यूएल INSERTभेजने वाले बैच से पहले इसे लगाना आवश्यक है ।

आप INSERT ... VALUES ...शुरुआत में एक SET IDENTITY_INSERT ... ON;स्ट्रिंग के साथ शुरू किए गए कई कमांड भेज सकते हैं । बस के बीच किसी भी बैच विभाजक मत डालो।

मुझे नहीं पता कि SET IDENTITY_INSERT ... ONब्लॉक भेजने के बाद काम करना क्यों बंद हो जाता है (उदाहरण के लिए: .ExecuteNonQuery()C # में)। मुझे SET IDENTITY_INSERT ... ON;अगले SQL कमांड स्ट्रिंग की शुरुआत में फिर से डालना पड़ा ।


शायद यह आपके सवाल का जवाब देता है: stackoverflow.com/questions/5791941/…
डेमेट्रिस लेप्टोस

-1

पहचान डालने के बाद आपको कमांड 'गो' जोड़ना होगा। उदाहरण:

SET IDENTITY_INSERT sometableWithIdentity ON
go

INSERT sometableWithIdentity (IdentityColumn, col2, col3, ...)
VALUES (AnIdentityValue, col2value, col3value, ...)

SET IDENTITY_INSERT sometableWithIdentity OFF
go

5
यह सवाल चार साल पुराना है और इसका एक स्वीकृत उत्तर है। आपका उत्तर स्वीकृत उत्तर को
घोस्ट

13
ठीक है, एक सटीक दोहराव नहीं - उसने "गो" आदेशों को शामिल किया ...;)
RoastBeast
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.