SQL सर्वर इंसर्ट - ट्रंकेशन त्रुटि पैदा करने वाले कॉलम की पहचान कैसे करें


11

मेरे पास एक संग्रहीत कार्यविधि है जो एक तालिका में 650 फ़ील्ड सम्मिलित करती है। ट्रंकेशन त्रुटि के साथ सम्मिलित विफल हो रहा है।

यह एक सरल है

INSERT INTO
SELECT (a bunch of fields) 
FROM (a bunch of tables)

नीचे त्रुटि संदेश है:

Msg 8152, स्तर 16, राज्य 14, प्रक्रिया DSP_Procedure, लाइन 1075 स्ट्रिंग या बाइनरी डेटा को छोटा किया जाएगा।

क्या कोई त्वरित तरीका है जिससे मैं पहचान सकता हूं कि किस क्षेत्र में ट्रंकेशन त्रुटि हो रही है?

तथ्य यह है कि तालिका में सम्मिलित किए जाने वाले चुनिंदा कथन में 650 फ़ील्ड हैं, जिससे यह इंगित करना मुश्किल हो जाता है कि कौन सी फ़ील्ड ट्रंकेशन त्रुटि का कारण बन रही है।

मैं सोच रहा हूं कि मैं एक समय में खेतों के ब्लॉक पर टिप्पणी कर सकता हूं, ताकि एक समय में केवल एसपी 100 क्षेत्र डालें और फिर एसपी 6 या 7 बार अलग-अलग समय तक चलाएं जब तक कि मैं कम से कम 100 क्षेत्रों के समूह को संकीर्ण नहीं कर सकता इसमें वह फ़ील्ड सम्‍मिलित होगा जो ट्रंकेशन त्रुटि का कारण बन रहा है।

वैकल्पिक रूप से मैं सोच रहा हूं कि शायद मैं SELECT INTOएक नई तालिका बना सकता हूं और फिर तालिका में डेटा लंबाई की तुलना कर सकता हूं । लक्ष्य तालिका की डेटा लंबाई मैं अपने एसपी में सम्मिलित करने की कोशिश कर रहा हूं कि यह देखने के लिए कि किस क्षेत्र में अपेक्षित फ़ील्ड लंबाई से अधिक लंबा है। ..

मैं SQL Server 2014 का उपयोग कर रहा हूं।

कोई आसान विकल्प?


1
मैं INFORMATION_SCHEMA.COLUMNS पर जाऊंगा और उन डेटा प्रकारों की तुलना करूंगा जिन्हें आप सम्मिलित करने का प्रयास कर रहे हैं। दुर्भाग्य से SQL सर्वर में वैरिएबल डिक्लेरेशन के लिए डायनेमिक डेटाटाइप्स नहीं है जैसे ORACLE करता है।
मुगेरत्रोरेस

2
मैं आपके दूसरे विकल्प का उपयोग करूँगा, एक नई (या # टैम्प) तालिका में सम्मिलित करूँगा और फिर कॉलम की लंबाई की तुलना करूँगा। या आप चयन में सभी स्तंभों के आसपास LEN () लपेट सकते हैं और फिर प्रत्येक के लिए एक अधिकतम (अधिकतम) कर सकते हैं ... जो आपको फ़ील्ड के लिए सबसे बड़ी पाठ लंबाई देगा। बेशक, यह मानता है कि यह एक चर क्षेत्र है जो आपको समस्याएं दे रहा है। स्मालडैटटाइम या टिनींट का उपयोग नहीं कर रहे हैं?
जोनाथन फाइट

1
मैं "सेलेक्ट इनटू" दृष्टिकोण के साथ जाऊंगा और कॉलम की लंबाई की तुलना करूंगा, हां। शायद "जहां 1 = 0" के साथ ताकि तालिका में कोई पंक्तियाँ न हों। यदि आपके SELECT में चयनित स्तंभों के लिए अद्वितीय नाम शामिल नहीं हैं, तो अजीब बात है। मैं प्रति कॉलम लिपि की एक पंक्ति के रूप में लंबी कॉलम सूचियों को प्रारूपित करता हूं, फिर यदि आवश्यक हो तो अगली पंक्ति पर "AS" कॉलम नाम और सूची में जगह बनाए रखने के लिए चार कॉलम के बाद एक रिक्त रेखा को आसान बना देता है। यह भी कई लाइनों का चयन करने और उन्हें टिप्पणियों में बदलने के लिए Ctrl + K Ctrl + C करने का समर्थन करता है, इसलिए आप उस तरह से सम्मिलित ऑपरेशन पर हमला कर सकते हैं, लेकिन जो कॉलम बचे हैं वे अशक्त होने होंगे।
रॉबर्ट कार्नेगी

जवाबों:


3

यदि आप SQL Server 2016 (SP2, CU6 या नए) पर हैं, तो एक विकल्प ट्रेस फ्लैग 460 को चालू करना है (QUERYTRACEON 460)। आउटपुट कॉलम और आपत्तिजनक डेटा को इंगित करेगा।

विवरण के लिए यह लेख देखें। https://www.brentozar.com/archive/2019/03/how-to-fix-the-error-string-or-binary-data-would-be-truncated/

यदि आप ट्रंकेशन की परवाह नहीं करते हैं तो आप SET ANSI_WARNINGS OFFउस प्रकार के ट्रंकेशन को अनदेखा करने के लिए उपयोग कर सकते हैं ।


9

दुर्भाग्य से, आपने काफी पुराने "फीचर" का सामना किया है । 2008 के बाद से एक कनेक्ट टिकट खुला है, और लगभग दस वर्षों से यह एक फिक्स वारंट के लिए पर्याप्त नहीं है।

मानक वैकल्पिक हल की तरह आप समझ, एक, है select into...तालिका मेटाडाटा की तुलना द्वारा पीछा किया। एक और संभावना है कि द्विआधारी आक्रामक स्तंभ की खोज कर रहा है, लेकिन यह मैनुअल काम भी है। मेटाडाटा तुलना के लिए कुछ हैक हैं, लेकिन सरल, सुरुचिपूर्ण समाधान मौजूद नहीं है। हो सकता है कि कुछ तृतीय-पक्ष उपकरण मदद के हों, लेकिन मुझे इस बारे में जानकारी नहीं है।


1

मेरे प्रश्न के अंत में इसे डालते समय (QUERYTRACEON 460) का उपयोग करना मेरे लिए कारगर नहीं रहा।

मैंने इसे DB स्तर पर चालू किया और इसने काम किया:

DBCC TRACEON(460, -1);
GO

लेकिन, यह सुनिश्चित करने के बाद कि आपने इसे ढूंढ लिया है और समस्या को ठीक कर लिया है, इसे छोड़ना नहीं है!

DBCC TRACEOFF(460, -1);
GO
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.