2011-02-15 13 views
13

मैं SQL Server 2008 R2 का उपयोग कर रहा हूं और मैं तालिका में कॉलम ऑर्डर में किसी विशिष्ट स्थान पर एक नया कॉलम जोड़ना चाहता हूं और अंत में नहीं। मैं टेबल को फिर से बनाने से बचना चाहता हूं। टेबल को पुनर्निर्माण किए बिना मैं इसे कैसे कर सकता हूं?SQL Server 2008 R2 किसी विशिष्ट स्थान में कॉलम जोड़ें

अर्थात

Table: Bob 
========== 
    Col1 
    Col2 

नया स्तंभ जोड़ने।

Table: Bob 
========== 
    Col1 
    NewCol 
    Col2 
+2

आपको तालिका को फिर से बनाना क्यों होगा, और कॉलम ऑर्डर आपके लिए क्यों मायने रखता है? –

+0

संभावित डुप्लीकेट: [विशिष्ट क्रमिक स्थिति में एक नया टेबल कॉलम जोड़ें] (http://stackoverflow.com/questions/769828/add-a-new-table-column-to- विशिष्ट-ordinal-position), [कॉलम जोड़ें विशिष्ट स्थान पर SQL सर्वर पर?] (http://stackoverflow.com/questions/3968954/add-column-on-sql-server-on- विशिष्ट-place) –

+0

लिंक के लिए धन्यवाद, हालांकि वे सभी तालिका को पुनर्निर्मित करने का उल्लेख करते हैं । – GordyII

उत्तर

19

आप नहीं कर सकते। कॉलम सूची के अंत में कॉलम हमेशा जोड़ा जाता है। आदेश बदलने का एकमात्र तरीका है स्क्रैच से तालिका को फिर से बनाना।

कहा जा रहा है कि, यह कभी भी आपके लिए कोई फर्क नहीं पड़ता कि कॉलम का वास्तविक भौतिक क्रम क्या है, न ही कॉलम परिभाषाओं का तार्किक क्रम। यदि आपके पास कॉलम ऑर्डर पर निर्भरता है, तो आपका कोड टूटा हुआ है। यदि आप कॉलम ऑर्डर से प्रदर्शन लाभ की अपेक्षा करते हैं, तो वे मिथक हैं।

+2

सहमत हुए। हालांकि, अक्सर यह आपके प्राथमिक कॉलम जैसे सामान्य फ़ील्ड के रूप में सामान्य फ़ील्ड रखने के लिए अच्छा होता है (एक बड़ी तालिका के साथ esp)। मानव पठनीयता के अलावा, स्तंभ आदेश के लिए शून्य महत्व है, लेकिन - यदि आप जोर देते हैं, तो एक चीज जो आप कर सकते हैं, एक नई टेबल, पुरानी तालिका से थोक निर्यात, नई तालिका में थोक डालने, और फिर एक करना होगा ड्रॉप/sp_rename। आपको यह सुनिश्चित करने की आवश्यकता होगी कि आप इस समय के दौरान मूल तालिका में होने वाले किसी भी बदलाव को रोकें, या एक ही लेनदेन के भीतर ड्रॉप/नाम बदलने से पहले सिंक-अप डालने/अपडेट स्क्रिप्ट चलाएं। – mattmc3

+3

हां, ऐसा करने का एकमात्र कारण मानव पठनीयता है, और केवल तब ही अगर ऐसा करने का कोई आसान तरीका था। ऐसा लगता है कि तालिका को पुनर्निर्माण के बिना कोई आसान नहीं है। प्रश्न का उत्तर देने के लिए सभी को धन्यवाद। – GordyII

9

ऐसा न करें। यह सलाह के साथ एक साथ जाता है कि कभी भी SELECT * का उपयोग न करें, इस मामले में जब आप सभी कॉलम सूचीबद्ध कर रहे हैं तो यह उनके आंतरिक आदेश का कारण क्यों है?

ने कहा, यदि आपको बिल्कुल होना चाहिए, तो यहां एक डेमो है जो तालिका को नहीं छोड़ता है। कॉलम को छोड़ना होगा, क्योंकि आप बीच में सम्मिलित नहीं कर सकते हैं।

create table BOB(col1 int, colspace int, col2 int, col3 varchar(10)) 
insert BOB values (1,3, 2,'test') 
; 
alter table BOB add col2_copy int, col3_copy varchar(10), NewCol datetime 
; 
update BOB set col2_copy = col2, col3_copy = col3 
; 
alter table BOB drop column col2 
alter table BOB drop column col3 
; 
alter table BOB add col2 int, col3 varchar(10) 
; 
update BOB set col2 = col2_copy, col3 = col3_copy 
; 
alter table BOB drop column col2_copy 
alter table BOB drop column col3_copy 
; 

select * from BOB 

आपके बाधाओं और चूक में शामिल होने के बाद यह अधिक कठिन हो जाता है।

+1

अपने परेड पर बारिश के लिए खेद है, लेकिन जब आप यह सब रन करते हैं तो sys.system_internals_partition_columns आईसी sys.partition p में ic.partition_id = p.partition_id पर ऑब्जेक्ट_आईडी = ऑब्जेक्ट_आईडी ('बीओबी') और देखो परिणाम पर सावधान रहें। और यदि आपको अभी भी संदेह है, तो कॉलम_आईडी 8 के leaf_offset को देखें। 'ड्रॉप कॉलम' कुछ भी नहीं छोड़ता है, बस कॉलम को 'अप्रयुक्त' के रूप में चिह्नित करता है। विशेष रूप से निश्चित कॉलम, वे अभी भी उस जगह पर कब्जा करेंगे। –

+1

अब, यदि आप एक वैकल्पिक तालिका में फेंकते हैं ... अंत में पुन: निर्मित, फिर हाँ, कॉलम गिराए जाते हैं। लेकिन आपने अभी भी तालिका को फिर से बनाया है (आंतरिक रूप से, और सभी बाधाओं और अनुमतियों को जगह में रखते हुए)। अधिकांशतः अंतर अकादमिक है, लेकिन जब डेटा का आकार निषिद्ध है तो तथ्य यह है कि तालिका का पुनर्निर्माण, एक तरफ या दूसरा, सभी अंतर करता है (यानी यह नहीं किया जा सकता है)। –

+0

@remus उत्तर वैसे भी अकादमिक था, क्योंकि पहले कुछ शब्द ** ** ** ऐसा करने के लिए नहीं हैं। यह दिखाने के लिए कार्य करता है कि स्तंभों (दृश्यमान) को कैसे स्थानांतरित करना है, जो किसी भी अंतराल के लिए इस तरह के विशिष्ट क्रम (आंतरिक रूप से) चाहते हैं, शायद यह एक डीएएल है जो केवल * का चयन करता है। कृपया स्पष्ट रूप से और गहन विस्तार के साथ प्रश्न का उत्तर जोड़ने के लिए स्वतंत्र महसूस करें। – RichardTheKiwi

1

कोई तरीका नहीं है कि मैंने स्क्रिप्ट को देखा है जो आप करने की कोशिश कर रहे हैं। हालांकि एसएसएमएस में (कम से कम 10.5 में) आप ऑब्जेक्ट एक्सप्लोरर में एक टेबल पर राइट क्लिक कर सकते हैं और डिज़ाइन चुन सकते हैं। यह आपको कॉलम ऑर्डर में कहीं भी कॉलम डालने की अनुमति देता है। यह आपकी तालिका पर चीजें भी प्रस्तुत करता है जैसे कि एफके संदर्भ, आदि

मैंने यह सत्यापित करने के लिए शोध नहीं किया है कि वास्तव में दृश्यों के पीछे SQL सर्वर वास्तव में क्या कर रहा है और मैं इसका उपयोग रोलआउट के लिए नहीं करता लेकिन यह वहां है।

+1

नई कॉलम परिभाषा की विशिष्ट परिभाषा के आधार पर, यह अभी भी तालिका को फिर से बना सकता है। – SchmitzIT

-2

आप तालिका पर दायाँ क्लिक करके ऐसा कर सकते हैं और ड्रैग और ड्रॉप द्वारा ऑर्डर को बदल सकते हैं और बदल सकते हैं।

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