2009-02-23 11 views
24

से संख्याओं वाले कॉलम का प्रकार बदलें हमारे पास डेटाबेस में दो कॉलम हैं जो वर्तमान में प्रकार वर्चर (16) हैं। बात यह है कि इसमें संख्याएं होती हैं और हमेशा संख्याएं होती हैं। इसलिए हम इसके प्रकार को पूर्णांक में बदलना चाहते हैं। लेकिन समस्या यह है कि इसमें निश्चित रूप से डेटा शामिल है।वर्चर से int

क्या कोई तरीका है कि हम उस कॉलम के प्रकार को वर्चर से int में बदल सकते हैं, और उन सभी संख्याओं को खो नहीं सकते जो पहले से मौजूद हैं? उम्मीद है कि हम कुछ प्रकार के एसक्यूएल को केवल अस्थायी कॉलम बनाने और सी # प्रोग्राम बनाने या रूपांतरण करने के लिए कुछ बनाने के बिना चला सकते हैं ... मुझे लगता है कि एसक्यूएल सर्वर के पास तारों को बदलने के लिए कुछ फ़ंक्शन है तो यह बहुत आसान हो सकता है संख्याएं, लेकिन मैं बहुत एसक्यूएल पर अस्थिर हूं। बहुत अधिक केवल सी # के साथ काम करते हैं और LINQ से SQL के माध्यम से डेटाबेस तक पहुंचते हैं।

नोट: हां, कॉलम को पहली जगह में एक वर्चर बनाना बहुत अच्छा विचार नहीं था, लेकिन दुर्भाग्य से जिस तरह से उन्होंने ऐसा किया।

उत्तर

30

यह एक अस्थायी तालिका का उपयोग किया जाएगा, लेकिन यह बहुत एसक्यूएल नहीं होगा करने के लिए केवल विश्वसनीय तरीका:

select * into #tmp from bad_table 
truncate table bad_table 
alter bad_table alter column silly_column int 
insert bad_table 
select cast(silly_column as int), other_columns 
from #tmp 
drop table #tmp 
+0

#tmp एक tmp तालिका का यादृच्छिक नाम है? – Svish

+1

अच्छा उत्तर - मैं यह पहली बार चुनिंदा कास्ट (silly_column int के रूप में), अन्य_columns खराब_टेबल से यह सुनिश्चित करने के लिए चलाएगा कि आपके पास कोई रूपांतरण समस्या नहीं है और वे सभी वास्तव में इनट्स हैं। – brendan

+3

मेरे द्वारा बनाए गए सभी नामों में से, आपने #tmp पर एक टिप्पणी की है? – cjk

8

बस प्रबंधन स्टूडियो में डेटाप्रकार बदलने

(आप जाने की जरूरत हो सकती है टूल्स> विकल्प> डिज़ाइनर, और उस विकल्प को अक्षम करें जो तालिका को फिर से बनाने वाले परिवर्तनों को सहेजता है)

+0

क्या मैं सभी मूल्यों को खो देता हूं ?? – Svish

+0

नहीं। यदि आप चाहें तो परीक्षण तालिका पर आज़माएं? – ctrlalt3nd

+0

मैंने अभी यह किया है और यह पूरी तरह से काम किया है। सबसे पहले मैंने जांच की है कि क्या सभी मौजूदा मान स्ट्रिंग प्रकार में संग्रहीत संख्याएं थीं और यदि मैं सभी वर्चर्स को संख्यात्मक प्रकार में सफलतापूर्वक रूपांतरित कर सकता हूं। कॉलम (इंडेक्स, कीज, ट्रिगर्स, ...) के सभी संदर्भों को अक्षम करने के बाद और एमएसएसएमएस में बदलाव को बढ़ा दिया। बढ़िया! – Rynkadink

1

मैं पिछले उत्तरों की पूरी तरह से सराहना करता हूं, लेकिन यह भी सोचा कि एक और पूर्ण उत्तर अन्य खोजकर्ताओं के लिए सहायक होगा ...

कुछ ऐसी चेतावनी हैं जो उत्पादन प्रकार तालिका में परिवर्तन करने पर सहायक होंगी।

  1. आप एक पहचान स्तंभ मेज पर परिभाषित है, तो आप डेटा की फिर से डालने के आसपास है और बंद IDENTITY_INSERT सेट करना होगा। आपको एक स्पष्ट कॉलम सूची का भी उपयोग करना होगा।
  2. आप, truncate आसपास TRANSACTIONS का उपयोग डेटाबेस में डेटा की हत्या नहीं के बारे में सुनिश्चित होना चाहते हैं// डालें प्रक्रिया
  3. परिवर्तन करने पर आप डेटा का एक बहुत कुछ है, तो बस वर्ग सर्वर प्रबंधन स्टूडियो में परिवर्तन करने के लिए कोशिश कर रहा है, तो एक टाइमआउट के साथ असफल हो सकता है और आप डेटा खो सकते हैं।

जवाब यह है कि @cjk दिया विस्तार करने के लिए, को देखने के बाद:

नोट: 'TUC' असली tablename शुरू के लिए इस स्क्रिप्ट में सिर्फ एक प्लेसहोल्डर है कोशिश लेन-देन शुरू

print 'Selecting Data...' 
    select * into #tmp_tuc from tuc 

    print 'Truncating Table...' 
    truncate table tuc 

    alter table tuc alter column {someColumnName} {someDataType} [not null] 
    ... Repeat above until done 

    print 'Reinserting data...' 
    set identity_insert tuc on 
    insert tuc (
    <Explicit column list (all columns in table)> 
) 
    select 
    <Explicit column list (all columns in table - same order as above)> 
    from #tmp_tuc 
    set identity_insert tuc off 

    drop table #tmp_tuc 
    commit 
    print 'Successful!' 
end try 
begin catch 
    print 'Error - Rollback' 
    if @@trancount > 0 
    rollback 

    declare @ErrMsg nvarchar(4000), @ErrSeverity int 
    select @ErrMsg = ERROR_MESSAGE(), @ErrSeverity = ERROR_SEVERITY() 

    set identity_insert tuc off 

    RAISERROR(@ErrMsg, @ErrSeverity, 1) 
end catch 
18

यह करने के लिए सबसे आसान तरीका है:

alter table myTable alter column vColumn int; 

यह देशा रूप में काम करेंगे के रूप में

  1. जी डेटा के सभी किसी पूर्णांक
  2. अंदर फिट होगा डेटा के सभी int करने के लिए परिवर्तित किया जा सकता है (यानी "कार" का मूल्य असफल हो जाएगा)
  3. कोई अनुक्रमणिका नहीं है जिसमें vColumn शामिल है।यदि इंडेक्स हैं, तो आपको एक ड्रॉप शामिल करने और उनके लिए वापस जाने की आवश्यकता होगी जहां आप थे।
+2

@svish काम किया: मैं वास्तव में यह चाहता था कि यह "कार" न हो 'char'। – jmoreno

+0

ओह! माफ़ कीजिये। समझें कि अब आप इसका क्या मतलब रखते हैं, हे :) :) – Svish

+0

इसने एक इलाज किया। प्रबंधन स्टूडियो के माध्यम से प्रयास करते समय यह असफल रहा – PowerMan2015

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