मैं "स्ट्रिंग या बाइनरी डेटा को काट दिया जाएगा" के लिए जिम्मेदार कॉलम (एस) की पहचान कैसे करें।


31

मैं कुछ प्रश्नों को स्वचालित रूप से कोड के साथ उत्पन्न कर रहा हूं जो मैंने दूरस्थ Pg डेटाबेस से चयन करने के लिए लिखा था, और एक स्थानीय SQL सर्वर डेटाबेस में डालें। हालाँकि, उनमें से एक यह त्रुटि उत्पन्न कर रहा है:

[Microsoft] [ODBC SQL सर्वर ड्राइवर] [SQL सर्वर] स्ट्रिंग या बाइनरी डेटा को छोटा किया जाएगा। (एसक्यूएल -22001) [राज्य 22001 अब 01000 था]

[Microsoft] [ODBC SQL सर्वर ड्राइवर] [SQL सर्वर] कथन को समाप्त कर दिया गया है। (SQL-01000) at। \ Insert.pl लाइन 106।

मुझे कैसे पता चलेगा कि कौन सा कॉलम त्रुटि उत्पन्न कर रहा है और इनपुट के लिए लंबाई का अभाव है? वहाँ एक तरीका है बल के बिना यह सब अनुमान लगा बल varchar?

जवाबों:


35

नहीं, यह कहीं भी लॉग इन नहीं है। वोट दें और अपने व्यवसाय के मामले को बताएं; यह SQL सर्वर में तय की जाने वाली चीजों की लंबी सूची में से एक है।

यह कनेक्ट पर वर्षों पहले अनुरोध किया गया था (शायद पहले SQL Server 2000 या 2005 समय सीमा में), फिर नए फीडबैक सिस्टम पर:

और अब इसे वितरित किया गया है, SQL Server 2019 , SQL Server 2017 CU12 में, और भविष्य में SQL Server 2016 SP2 CU में दिखाई देगा।

एसक्यूएल सर्वर 2019 के पहले सार्वजनिक CTP में, यह केवल ट्रेस ध्वज 460 गुप्त की तरह यह लगता है के तहत सतहों, लेकिन यह में प्रकाशित हुआ था इस Microsoft श्वेतपत्र । यह आगे जाने वाला डिफ़ॉल्ट व्यवहार (कोई ट्रेस ध्वज आवश्यक नहीं) होगा, हालांकि आप एक नए डेटाबेस स्कोप्ड कॉन्फ़िगरेशन के माध्यम से इसे नियंत्रित करने में सक्षम होंगे VERBOSE_TRUNCATION_WARNINGS

यहाँ एक उदाहरण है:

USE tempdb;
GO
CREATE TABLE dbo.x(a char(1));

INSERT dbo.x(a) VALUES('foo');
GO

SQL Server 2019 से पहले सभी समर्थित संस्करणों में परिणाम:

Msg 8152, Level 16, State 30, Line 5
स्ट्रिंग या बाइनरी डेटा को छोटा किया जाएगा।
बयान समाप्त कर दिया गया है।

अब, SQL सर्वर 2019 CTP पर, ट्रेस ध्वज सक्षम होने के साथ:

DBCC TRACEON(460);
GO

INSERT dbo.x(a) VALUES('foo');
GO
DROP TABLE dbo.x;
DBCC TRACEOFF(460);

परिणाम तालिका, कॉलम और ( पूर्ण नहीं, काटे गए ) मान दिखाता है :

एमएसजी 2628, लेवल 16, स्टेट 1, लाइन 11
स्ट्रिंग या बाइनरी डेटा को तालिका 'tempdb.dbo.x', कॉलम 'a' में काट दिया जाएगा। काट दिया गया मान: 'f'।
बयान समाप्त कर दिया गया है।

जब तक आप सब कुछ छोड़ सकते हैं और SQL Server 2019 में अपग्रेड कर सकते हैं, या Azure SQL डेटाबेस में जा सकते हैं, आप अपने "ऑटोमैजिक" कोड को वास्तव में max_length से खींच सकते हैं sys.columns, साथ ही उस नाम के साथ जिसे आप वैसे भी प्राप्त कर रहे हैं, और फिर आवेदन करना होगा LEFT(column, max_length)या जो भी पीजी के समकक्ष है। या, इसका मतलब है कि आप चुपचाप डेटा खो देंगे, यह जानने के लिए कि कॉलम क्या बेमेल हैं और गंतव्य कॉलम को ठीक करें ताकि वे स्रोत से सभी डेटा को फिट कर सकें। मेटाडाटा को दोनों प्रणालियों तक पहुंच प्रदान करता है, और यह तथ्य कि आप पहले से ही एक क्वेरी लिख रहे हैं जो स्वचालित रूप से स्रोत से मेल खाना चाहिए -> गंतव्य कॉलम (अन्यथा यह त्रुटि शायद ही आपकी सबसे बड़ी समस्या होगी), आपको कोई भी क्रूरता नहीं करनी चाहिए बिल्कुल अनुमान लगाना।


2

यदि आपके पास SQL सर्वर प्रबंधन स्टूडियो से SQL सर्वर आयात और निर्यात विज़ार्ड चलाने का अधिकार है (राइट-क्लिक डेटाबेस> कार्य> आयात डेटा ...) पर क्लिक करें, तो SQL क्लाइंट से आपकी क्वेरी का उपयोग करके डेटा स्रोत के रूप में गंतव्य पर आयात करें। तालिका।

आयात चलाने से पहले, आप डेटा मैपिंग की समीक्षा कर सकते हैं और यह आपको बताएगा कि किस कॉलम में असंगत फ़ील्ड प्रकार हैं। और यदि आप आयात कार्य चलाते हैं, तो यह आपको बताएगा कि कौन सा कॉलम आयात करने में विफल रहा है।

नमूना सत्यापन चेतावनी:

चेतावनी 0x802092a7: डेटा फ्लो टास्क 1: डेटा प्रवाह स्तंभ "NARRATIVE" से डेटा डालने के कारण 316 की लंबाई के साथ डेटाबेस कॉलम "NARRATIVE" 60 की लंबाई के साथ हो सकता है। (SQL Server आयात और निर्यात विज़ार्ड)


1

अंततः, मुझे स्वयं लिखे बिना कॉलम की जानकारी प्राप्त करने का कोई तरीका नहीं मिला।

इस त्रुटि संदेश द्वारा उत्पन्न किया गया था DBD::ODBC, लेकिन आप भी उपयोग कर सकते हैं sys.columns (max_length)(मैं अभी नहीं जानता कि कैसे)।

मैंने अपने कॉलम सूची में दो तत्वों के साथ सरणियों की सूची प्राप्त करने के लिए इस तरह के कोड का उपयोग किया COLUMN_NAME, और, MAX_LENGTH( DBIcolumn_info() में प्रलेखित )।

my @max_lengths = map [ @{$_->fetchall_arrayref->[0]}[3,6] ]
    , map $dbh_mssql->column_info('database', 'dbo', $dest_table, $_)
    , @col_mssql
;

फिर मैंने अपवादों को पकड़ लिया INSERTऔर कुछ उपयोगी छाप दिया। इस उदाहरण @$rowमें डेटा को भेजा गया हैsth->execute()

if ($@) {
        warn "$@\n";
        for ( my $idx=0; $idx <= $#{ $row }; $idx++ ) {
                Dumper {
                        maxlength => $max_lengths[$idx]->[1]
                        , name    => $max_lengths[$idx]->[0]
                        , length  => length( $row->[$idx] )
                        , content => $row->[$idx]
                };
        }
        die;
}

इसके अलावा, कृपया वोट करें और दूसरे उत्तर को बढ़ाएं


2
मैंने कोई कोड रेफ़रिंग नहीं किया sys.columnsक्योंकि मुझे इस बात का बिलकुल भी अंदाज़ा नहीं था कि आप वर्तमान में "ऑटोमैटिकली" कौन से कोड का उपयोग कर रहे हैं जो आपके प्रश्नों को उत्पन्न करते हैं। वास्तव में बहुत अधिक जटिल नहीं है कि मैं आपके कोड में शामिल करने के बारे में अनुमान लगा सकता हूं SELECT name, object_id, max_length FROM sys.columns;। चूँकि आपके पास पहले से ही आटोमैटिक कोड है जो यह कर रहा होगा - या ऐसा कुछ बहुत - मुझे नहीं लगता कि एक उदाहरण आवश्यक था।
हारून बर्ट्रेंड

मुझे यकीन नहीं है कि sys.columnsदो कॉलम के साथ कैसे काम करता है जो समान हैं name। इसके अलावा, मुझे लाइब्रेरी के बजाय काम करने वाली चीज़ मिल गई, मैं उसे sysचुना हुआ उत्तर क्यों बनाऊंगा? Microsoft SQL doesn't have x, do y insteadएक वैध योगदान है, लेकिन अगर आप yमेरे लिए नीच हैं y, तो मैं कुछ अलग करने जा रहा हूं और इसे चुना।
इवान कैरोल

1
आपका प्रश्न, अनिवार्य रूप से, मुझे कैसे पता चलेगा कि कॉलम क्या त्रुटि उत्पन्न कर रहा था (संभवतः, इसलिए आप समाधान को फिर से इंजीनियरिंग करने के बजाय उस एक स्थान को ठीक कर सकते हैं)। मैंने तुमसे कहा था कि कहाँ देखना है: sys.columns। यह ठीक वही है जहाँ आपको गंतव्य स्तंभ की लंबाई के साथ अपने स्रोत कॉलम की लंबाई की तुलना करनी चाहिए। तुम कैसे हो कि तुम पर निर्भर है। मैंने आपको यह नहीं बताया कि आप अपने कोड को कैसे ठीक कर सकते हैं, क्योंकि मुझे इस बात का बिलकुल भी पता नहीं है कि पहली बार आपकी ऑटोमैटिक क्वेरी कैसे उत्पन्न हो रही है, इसलिए, जैसा कि मैंने कहा, आपके पास पहले से जो भी क्वेरी थी उसकी लंबाई निर्धारण को जोड़ने का कोई विचार नहीं था। ।
हारून बर्ट्रेंड

1

अंत में माइक्रोसॉफ्ट सार्थक जानकारी प्रदान करने के लिए फैसला किया है के लिए String or binary would be truncatedएसक्यूएल सर्वर 2016 SP2 के सीयू, एसक्यूएल सर्वर 2017 CU12 से और SQL सर्वर 2019 में शुरू।

जानकारी में अब आपत्तिजनक तालिका स्तंभ (पूरी तरह से योग्य नाम) और अपमानजनक मूल्य (120 वर्णों में विभाजित) दोनों शामिल हैं:

Msg 2628, Level 16, State 1, Line x String या बाइनरी डेटा को 'TheDb.TheSchema.TheTable', कॉलम 'TheColumn' की तालिका में छोटा किया जाएगा। काट दिया गया मान: '...'। बयान समाप्त कर दिया गया है।

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