2015-08-12 6 views
5

मैं Float (शून्य) से Varchar(25) (शून्य) से तालिका में कॉलम में डेटाटाइप बदलने की कोशिश कर रहा हूं। वर्तमान डेटा में सबसे बड़ी फ्लोट 12 अंकों है, लेकिन भविष्य में अधिक अंक जोड़े जाने पड़ सकते हैं, इसलिए varchar(25)एसक्यूएल कनवर्टिंग कॉलम प्रकार फ्लोट से वर्कर

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

हालांकि, मुझे कुछ कठिनाइयों का सामना करना पड़ रहा है।

ALTER TABLE Customer 
ALTER COLUMN Phonenumber varchar(25) 

यह मैं वांछित परिणाम नहीं दे करता है:

मैं निम्नलिखित की कोशिश की है।

  • एक नया (अस्थायी) स्तंभ PhonenumberVarchar
  • बनाना एक स्तंभ से परिवर्तित और डेटा को कॉपी:

    उदाहरण 1549779498 के लिए यह की तर्ज में 1.54978e+009

    तो मैं कोशिश की है कुछ हो जाता है दूसरे

  • पुराने कॉलम को हटाकर
  • पुराने कॉलम को नए कॉलम का नाम बदलना

कोड:

ALTER TABLE Customer 
ADD PhonenumberVarchar varchar(25) 

UPDATE Customer 
SET PhonenumberVarchar = STR(Phonenumber, 12, 0) 

ALTER TABLE Customer 
DROP COLUMN Phonenumber 

EXEC sp_rename 'Customer.PhonenumberVarchar', 'Phonenumber', 'COLUMN' 

यह या तो काम नहीं करता:

Subquery 1 से अधिक मान दिया। यह अनुमति नहीं है जब subquery =,! = <, < =,>,> = या जब subquery अभिव्यक्ति के रूप में प्रयोग किया जाता है।

और अब यह देर हो चुकी है और मेरे सिर में दर्द ...

किसी को भी मदद कर सकते हैं?

नोट:

मेज, बल्कि बड़ी है कुछ 15 लाख पंक्तियाँ, तो प्रदर्शन एक मुद्दा हो सकता है।

SQL सर्वर का उपयोग करना।

उत्तर

3

आप के माध्यम से एक decimal पहले जा रहा करके इसे ठीक कर सकते हैं:

ALTER TABLE Customer ALTER COLUMN Phonenumber decimal(25, 0); 
ALTER TABLE Customer ALTER COLUMN Phonenumber varchar(25); 

आप समान व्यवहार प्राप्त जब cast() का उपयोग कर:

select cast(cast(cast(1549779498 as float) as decimal(25)) as varchar(255)) 
:

select cast(cast(1549779498 as float) as varchar(255)) 

तो ठीक से चित्रित किया गया है

documentationके लिएस्पष्ट रूप से संदर्भ cast():

कुछ डेटा प्रकार परिवर्तन डेटा में बदलाव का कारण बन सकते हैं। उदाहरण के लिए, char या varchar में nchar या nvarchar कॉलम को बदलकर विस्तारित वर्णों का रूपांतरण हो सकता है। अधिक जानकारी के लिए, CAST और CONVERT (ट्रांजैक्ट-एसक्यूएल) देखें। कॉलम की परिशुद्धता या स्केल को कम करने से डेटा कटाव हो सकता है।

संपादित करें:

आप डेटा लोड के बाद, मैं सुझाव है कि आप भी एक चेक बाधा जोड़ें:

check (PhoneNumber not like '%[^0-9]%') 

यह सुनिश्चित होगा कि संख्या - और केवल संख्या - में रहते हैं भविष्य में कॉलम।

+0

ऐसा लगता है कि यह काम करता है। तो अगर मैं सही ढंग से समझता हूं कि दशमलव रूपांतरण के साथ चाल पहले यह सुनिश्चित करने के लिए है कि राउंडिंग त्रुटियों को मैं सीधे nvarchar का उपयोग कर प्राप्त कर दूं? – user2110298

+1

@ user2110298। । । हां, हालांकि मुझे यकीन नहीं है कि वे वास्तव में त्रुटियों को गोल कर रहे हैं। रूपांतरण के लिए उपयोग किया गया प्रतिनिधित्व वह नहीं है जो आप चाहते हैं, और यह उस मुद्दे के आसपास अपेक्षाकृत सरल तरीका है। –

0
ALTER TABLE Customer ADD PhonenumberVarchar VARCHAR(25) 

GO 

UPDATE Customer SET PhonenumberVarchar = str (Phonenumber,12,0) 

ALTER TABLE Phonenumber ALTER COLUMN Phonenumber VARCHAR(25) 

UPDATE Customer SET Phonenumber = PhonenumberVarchar 

ALTER TABLE Customer DROP COLUMN PhonenumberVarchar 
+0

इस कोड का उपयोग कर मूल पोस्ट में वर्णित त्रुटि अभी भी हो जाती है। – user2110298

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