2009-06-01 10 views
25

SQL सर्वर 2000 या उससे ऊपर में निम्न प्रकार की कथन का उपयोग करते समय ऑटो जनरेटेड प्राथमिक कुंजी (पहचान) कॉलम को संभालने के लिए वैसे भी है?"तालिका मानों()" कथन में सम्मिलित करें "में पहचान कॉलम को संभालना?

Insert Into TableName Values(?, ?, ?) 

मेरा लक्ष्य बिल्कुल स्तंभ नाम का उपयोग नहीं करने के लिए है।

1) या तो स्तंभ नाम सूची (पहचान स्तंभ के बिना उल्लेख करें):

+4

क्यों नहीं करते आप एक स्तंभ नाम सूची का उपयोग करना चाहते है? –

+0

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

+0

@ nemo-- पहले "त्वरित पैच" स्थिति में होने के बाद, मैं आपको इस पर एक पास दूंगा। लेकिन कृपया, सड़क के नीचे अपने स्वयं के लिए, अगले पूर्ण अपडेट में कॉलम नाम निर्दिष्ट करने की योजना बनाएं .... – RolandTumble

उत्तर

49

डिफ़ॉल्ट रूप से, अगर आप एक पहचान स्तंभ है, तो आप कर नहीं में यह निर्दिष्ट करने की आवश्यकता मूल्य अनुभाग। यदि आपका टेबल है:

ID NAME ADDRESS 

तो फिर तुम कर सकते हैं:

INSERT INTO MyTbl VALUES ('Joe', '123 State Street, Boston, MA') 

हो जाएगा ताकि आप के लिए आईडी को स्वत: जनरेट, और अगर इसके बारे में सोचने की जरूरत नहीं है। यदि आप SET IDENTITY_INSERT MyTbl ON, तो आप आईडी कॉलम के लिए एक मान असाइन कर सकते हैं।

+1

ओह सच में? यह शानदार है। मैंने अभी सोचा था कि काम नहीं करेगा। मुझे यह कोशिश करने दो। –

+0

@Eric सही है कि ऊपर बिंदु 1 में मेरा क्या मतलब है (मेरा इरादा दिखाने के लिए संपादित किया गया है), +1 –

+0

एरिक यह मेरे लिए बिल्कुल काम नहीं कर रहा है। यह शिकायत कर रहा है कि मेरे पास, पहचान सम्मिलित है, मुझे लगता है क्योंकि यह आईडी में मूल्यों में पहला आइटम डालने का प्रयास कर रहा है। पहले कॉलम को अनदेखा करने के लिए आपको कुछ विशिष्ट सेट करना होगा? –

6

आप 2 विकल्प हैं।

2) सेट IDENTITY_INSERT tablename चालू करें, उसके बाद सम्मिलित बयान जो पहचान कॉलम के लिए स्पष्ट मान प्रदान करते हैं, उसके बाद SET IDENTITY_INSERT tablename OFF।

आप एक स्तंभ नाम सूची से परहेज कर रहे हैं, शायद यह 'चाल' मदद कर सकता है ?:

-- Get a comma separated list of a table's column names 
SELECT STUFF(
(SELECT 
',' + COLUMN_NAME AS [text()] 
FROM 
INFORMATION_SCHEMA.COLUMNS 
WHERE 
TABLE_NAME = 'TableName' 
Order By Ordinal_position 
FOR XML PATH('') 
), 1,1, '') 
+0

स्पष्ट करने के लिए, स्पष्ट मूल्यों से आपका मतलब है कि आपको यह देखने के लिए डेटाबेस से पूछना होगा कि अनुक्रम में अगली पहचान क्या है यह मैन्युअल रूप से होगा और डालेंगे? –

+0

नहीं, आप किसी भी मान का उपयोग कर सकते हैं जो पहले से मौजूद नहीं है, लेकिन अगला अनुक्रम सबसे बड़ा प्लस वन से शुरू होगा .... –

+0

यह केवल तभी उपयोग किया जाता है जब आपके पास संदर्भ डेटा जैसा कुछ होना आवश्यक हो विभिन्न अनुप्रयोग प्रतिष्ठानों में सटीक वही आईडी मान –

2

चूंकि यह व्यावहारिक एरिक के जवाब यह है कि यह आप के लिए काम नहीं कर रहा में अपनी टिप्पणी के जवाब में, एक टिप्पणी में कोड डाल करने के लिए नहीं है ...

मैं सिर्फ एक एसक्यूएल 2005 बॉक्स पर निम्नलिखित भाग गया (खेद डिफ़ॉल्ट सेटिंग वाला कोई 2000 काम) है और यह त्रुटि के बिना काम किया:

CREATE TABLE dbo.Test_Identity_Insert 
(
    id INT IDENTITY NOT NULL, 
    my_string VARCHAR(20) NOT NULL, 
    CONSTRAINT PK_Test_Identity_Insert PRIMARY KEY CLUSTERED (id) 
) 
GO 

INSERT INTO dbo.Test_Identity_Insert VALUES ('test') 
GO 

SELECT * FROM dbo.Test_Identity_Insert 
GO 

आप शायद ID मान अपने मूल्यों की सूची में से अधिक भेज रहे हैं? मुझे नहीं लगता कि अगर आप वास्तव में इसके लिए मूल्य पास करते हैं तो आप कॉलम को अनदेखा कर सकते हैं। उदाहरण के लिए, यदि आपकी तालिका में 6 कॉलम हैं और आप पहचान कॉलम को अनदेखा करना चाहते हैं तो आप केवल 5 मान पास कर सकते हैं।

+0

आपका कथन मेरे लिए भी ठीक काम करता है, बहुत अजीब है। –

22

कॉलम सूची उत्पन्न करने के लिए एक और "चाल" ऑब्जेक्ट एक्सप्लोरर से "कॉलम" नोड को एक क्वेरी विंडो पर खींचने के लिए है। अन्यथा अपने मूल डालने यदि आप किसी अन्य जोड़ने टूट जाएगा

सम्मिलित में TableName (col1, col2, col2) मान

(?,,?):

+3

+1 इसने मुझे बहुत मदद की। स्क्वायर ब्रैकेट के साथ इसके टैंट्रम को छोड़कर। – Kermit

+1

शायद एसओ से प्राप्त सबसे अच्छी टिप हो सकती है। बहुत बढ़िया! – ryanulit

9

सबसे अच्छा अभ्यास स्पष्ट रूप से कॉलम सूची है अपनी मेज पर कॉलम।

+0

हाँ मेरे मालिक ने वास्तव में वही बात कहा था। आप दोनों पूरी तरह से सही हैं, लेकिन इस डेटाबेस में डेटा इन-परमिट है (यानी दैनिक मिटा दिया जाता है और पुन: उत्पन्न होता है) ताकि अगर ऐसा कुछ हुआ तो यह दुनिया का अंत नहीं होगा। –

1

समाधान:

1) सेट identity_insert पर करने के लिए।

2) ग्राहक तालिका में ग्राहक डेटा डालें।

3) पहचान करने के लिए IDENTITY_INSERT सेट करें।

पूरा लेख here पढ़ें।

+0

प्रश्न पहचान कॉलम को ओवरराइड करने के बारे में नहीं है, लेकिन फ़ील्ड नामों के उपयोग से बचने के लिए और पहचान कॉलम को इच्छित के रूप में कार्य करने दें। – bummi

0
set identity_insert customer on 
insert into Customer(id,Name,city,Salary) values(8,'bcd','Amritsar',1234) 

जहां 'ग्राहक की तालिका नाम

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