2015-12-09 9 views
6

तो मैं प्रकार VARCHAR (100) के एक स्तंभ के साथ एक table है और वहाँ SQL Server 2012 (T-SQL) कॉन्फ़िगर करने के लिए इतना है कि एक सौदे 101+ वर्णों की स्ट्रिंग सबमिट करने का प्रयास करता है, तो कोई तरीका है मैं सोच रहा हूँ तो यह पहले 100यदि वे बहुत बड़े हैं तो मैं SQL सर्वर 2012 कटाव सम्मिलन कैसे कर सकता हूं?

लेता है

क्या यह संभव है, या मुझे C# चीजों के पक्ष में truncation करना चाहिए ???

+0

क्या आप अपना 'INSERT' कथन पोस्ट कर सकते हैं? –

+2

मुझे लगता है कि डीबी-पक्ष किया जाना संभव है, लेकिन शायद यह एक बुरा विचार है। एप्लिकेशन परत में यह बेहतर है, अन्यथा आप 6 महीने में एक बग में भागने जा रहे हैं (कहें) 6 महीने और आपको पता नहीं है कि आपका डीबी डेटा को यादृच्छिक रूप से दूषित क्यों कर रहा है। – Rob

उत्तर

4

आम तौर पर, एसक्यूएल सर्वर एक क्षेत्र में और अधिक डेटा सम्मिलित करने के लिए की तुलना में यह

स्ट्रिंग धारण कर सकते हैं या बाइनरी डेटा छोटा किया जाएगा किसी भी प्रयास पर एक त्रुटि पेश करेंगे। बयान समाप्त कर दिया गया है।

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

डिफ़ॉल्ट रूप से, ANSI_WARNINGS चालू हो जाते हैं, और गणना की गई कॉलम या अनुक्रमित दृश्यों पर इंडेक्स बनाने जैसी कुछ गतिविधियां आवश्यक होती हैं कि वे चालू हों। लेकिन अगर वे बंद हो जाते हैं, तो SQL सर्वर कॉलम में फिट करने के लिए आवश्यक डेटा को छोटा कर देगा। ANSI_WARNINGS एक सत्र के लिए की स्थापना एक तालिका में एक डालने के साथ विपरीत द्वारा

SET ANSI_WARNINGS { ON|OFF } 

नियंत्रित किया जा सकता, एसक्यूएल सर्वर चुपचाप डेटा है कि एक चर करने के लिए आवंटित किया जा रहा है, ANSI_WARNINGS की स्थिति की परवाह किए बिना कट जाएगा। उदाहरण के लिए:

declare @smallString varchar(5) 
declare @testint int 
set @smallString = 'This is a long string' 
set @testint = 123.456 
print @smallString 
print @testint 

परिणाम है:

This 
123 

यह कभी कभी एक संग्रहीत प्रक्रिया में कोई मान गुजर के बाद से सूक्ष्म तरीकों से ही दिखा सकते हैं या समारोह पैरामीटर चर करने के लिए इसे प्रदान करती है और चुपचाप एक रूपांतरण करना होगा ।एक तरीका जो इस स्थिति के खिलाफ सुरक्षा में मदद कर सकता है वह किसी भी पैरामीटर को देना है जो सीधे तालिका में डाला जाएगा लक्ष्य कॉलम की तुलना में एक बड़ा डेटाटाइप ताकि SQL सर्वर त्रुटि बढ़ाए, या शायद पैरामीटर की लंबाई जांच सके और जब यह बहुत लंबा होता है तो इसे संभालने के लिए कस्टम कोड।

उदाहरण के लिए, यदि एक संग्रहीत प्रक्रिया वर्चर (10) वाले कॉलम वाले डेटा में डेटा डालने के लिए पैरामीटर का उपयोग करेगी, तो पैरामीटर वर्कर (15) बनाएं। फिर यदि कॉलम के लिए पास किया गया डेटा बहुत लंबा है, तो यह रोलबैक करेगा और चुपचाप छंटनी और डालने की बजाय एक छंटनी त्रुटि उठाएगा। बेशक, यह किसी भी व्यक्ति को भ्रामक होने का जोखिम चलाता है जो संग्रहीत प्रक्रियाओं को समझने के बिना हेडर जानकारी को देखता है।

Source: Silent Truncation of SQL Server Data Inserts

0

मेरा सुझाव किसी भी DB ऑपरेशन को कॉल करने से पहले इनपुट को सत्यापित करने के लिए एप्लिकेशन पक्ष को जिम्मेदार बनाना होगा।

SQL सर्वर चुपचाप varchars को stored procedure parameters के रूप में varchar की लंबाई में निर्दिष्ट करता है। तो आपको अपनी आवश्यकताओं के लिए stored procedures पर विचार करने की कोशिश करनी चाहिए। तो यह स्वचालित रूप से संभाला जाएगा।

1

कोड स्तर पर ऐसा करें। जब आप वर्तमान फ़ील्ड डाल रहे हों तो फ़ील्ड की लंबाई जांचें और इसे सबस्ट्रिंग करें।

string a = "string with more than 100 symbols"; 

if(a.Length > 100) 
    a = a.Substring(0, 100); 

इसके बाद आप सम्मिलित क्वेरी में एसक्यूएल पैरामीटर के रूप में जोड़ रहे हैं।

दूसरा तरीका यह प्रश्न में करना है, लेकिन फिर मैं आपको ऐसा करने की सलाह नहीं देता हूं।

INSERT INTO Table1('YourColumn') VALUES(LEFT(RTRIM(stringMoreThan100symbols), 100)) 

वाम स्ट्रिंग काटने जाता है और RTRIM स्ट्रिंग के ट्रिम आपरेशन प्रदर्शन कर रहा है।

+0

क्या कोई तरीका है कि मैं 'वचरर' कॉलम की लंबाई प्राप्त कर सकता हूं ताकि मेरे पास "जादू संख्या" 100 न हो? – user5648283

+0

@ user5648283: आप [getchemaTable से कॉलम आकार और डेटा टाइप] पा सकते हैं (http://stackoverflow.com/a/17211438/3796048) –

0

आप इकाई वर्गों (एफई से जरूरी नहीं) है, तो आप ऐसा करने StringLength(your field length) विशेषता का उपयोग कर सकते हैं।

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