2010-06-16 14 views
10

के लिए ऑल्टर कॉलम मैं एमएस एसक्यूएल सर्वर 2003 के साथ काम कर रहा हूं। मैं प्रविष्टियों में कम वर्ण रखने के लिए अपनी एक तालिका में एक कॉलम बदलना चाहता हूं। यह इस प्रश्न के समान है: Altering a Table Column to Accept More Characters इस तथ्य को छोड़कर कि मैं अधिक के बजाय कम वर्ण चाहता हूं।एसक्यूएल: छोटे अक्षर (एन) प्रकार

मेरे पास मेरी एक तालिका में एक कॉलम है जिसमें नौ अंकों की प्रविष्टियां हैं। पहले टेबल पर काम कर रहे एक डेवलपर ने गलती से कॉलम को दस अंकों की प्रविष्टियों को रखने के लिए सेट किया था। मुझे CHAR(10) से CHAR(9) पर प्रकार बदलने की जरूरत है।

चर्चा ऊपर लिंक से निर्देशों का पालन करना, मैं बयान

लिखा

ALTER तालिका [My_table] स्तंभ को बदलने [MY_COLUMN] CHAR (9);

यह त्रुटि संदेश देता है "स्ट्रिंग या बाइनरी डेटा काटा जाएगा"। मैं देखता हूं कि मेरे नौ अंकों के तारों में उन्हें दस अंक बनाने के लिए एक स्थान जोड़ा गया है।

अतिरिक्त स्थान को त्यागने और मेरे कॉलम को CHAR (9) प्रकार में बदलने के लिए मैं SQL सर्वर कैसे कहूं?

+0

@marc_s, माफ करना, टाइपो –

उत्तर

11

मुझे लगता है कि आपको त्रुटि मिलती है क्योंकि उस तालिका में कुछ मान हैं जो बिल्कुल 10 वर्ण लंबे हैं (बिना पिछली जगहों के)। इस तालिका को बदलने से इन मानों को लंबाई 9 तक घटा दिया जाएगा।

डिफ़ॉल्ट रूप से इसकी अनुमति नहीं है। अगर वहां केवल तार होंगे जो कुछ पीछे की जगहें होंगी, तो इसमें कोई समस्या नहीं होगी।

इसलिए, यदि आप उन मूल्यों को काटने के साथ ठीक कर रहे हैं,

UPDATE MY_TABLE SET MY_COLUMN = LEFT(MY_COLUMN, 9)

पहले क्या उस के बाद बदलते हैं।

+0

स्वीकृत: इस काम करता है। दिलचस्प बात यह है कि, कोई भी मूल्य बिना किसी स्पेस के 9 वर्णों से अधिक वर्णित होता। हालांकि, 'अद्यतन' कथन का उपयोग करके आप 'ALTER' कथन से पहले अनुशंसा करते हैं कि यह कार्य करता है। –

+0

यह अजीब है लेकिन यह वास्तव में काम करता है :) – Muflix

8

अपनी तालिका को बदलने से पहले Ansi Warnings अक्षम करें।

SET ANSI_WARNINGS OFF 

कि डेटा खबरदार छोटा किया जा होगा अगर आप कुछ 10 वर्ण लंबा है करने के लिए होता है।

संपादित

चेक मौजूदा वास्तव में स्तंभ की लंबाई को बदलने से पहले लंबाई।

SET ANSI_WARNINGS OFF 
GO 

CREATE TABLE Test (Value CHAR(10)) 
INSERT INTO Test SELECT ('1234567890') 

IF NOT EXISTS (SELECT * FROM Test WHERE LEN(Value) > 9) 
    ALTER TABLE Test ALTER COLUMN Value CHAR(9) 
ELSE 
    SELECT LEN(Value), * FROM Test WHERE LEN(Value) > 9 

DROP TABLE Test 
+1

मैं पहले कोड को चेक करने के लिए कोड डालता हूं कि 10 वीं बाइट कहीं भी सेट है या नहीं, और अगर यह त्रुटि हो तो बाहर निकलें। –

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