"স্ট্রিং বা বাইনারি ডেটা কেটে ফেলা হবে" এর জন্য দায়বদ্ধ কলাম (গুলি) কীভাবে সনাক্ত করব।


31

আমি একটি দূরবর্তী পিজি ডাটাবেস থেকে নির্বাচন করতে লিখেছি কোড সহ স্বয়ংক্রিয়ভাবে কিছু প্রশ্ন উত্পন্ন করছি এবং একটি স্থানীয় এসকিউএল সার্ভার ডাটাবেসে প্রবেশ করিয়েছি। তবে, তাদের মধ্যে একটি এই ত্রুটি তৈরি করছে:

[মাইক্রোসফ্ট] [ওডিবিসি এসকিউএল সার্ভার ড্রাইভার] [এসকিউএল সার্ভার] স্ট্রিং বা বাইনারি ডেটা কাটা হবে। (এসকিউএল -22001) [রাষ্ট্র এখন 22001 এখন 01000]

[মাইক্রোসফ্ট] [ওডিবিসি এসকিউএল সার্ভার ড্রাইভার] [এসকিউএল সার্ভার] বিবৃতিটি সমাপ্ত করা হয়েছে। (এসকিউএল -01000) এ \ insert.pl লাইন 106।

কোন কলাম কীভাবে ত্রুটিটি উত্পন্ন করছে এবং ইনপুটটির দৈর্ঘ্যের অভাব রয়েছে তা আমি কীভাবে জানতে পারি? জোর করে বল-অনুমান না করে কি এমন কোনও উপায় আছে varchar?

উত্তর:


35

না, এটি কোথাও লগড নেই। ভোট দিন এবং আপনার ব্যবসায়ের কেস বর্ণনা করুন; এসকিউএল সার্ভারে ঠিক করা উচিত এমন জিনিসগুলির দীর্ঘ তালিকায় এটি একটি।

বহু বছর আগে এটি কানেক্টে (সম্ভবত এসকিউএল সার্ভার 2000 বা 2005 টাইমফ্রেমে প্রথম) অনুরোধ করা হয়েছিল, তারপরে আবার নতুন প্রতিক্রিয়া সিস্টেমে:

এবং এখন এটি এসকিউএল সার্ভার 2019 , এসকিউএল সার্ভার 2017 সিইউ 12 এ বিতরণ করা হয়েছে এবং ভবিষ্যতে এসকিউএল সার্ভার 2016 এসপি 2 সিউতে উপস্থিত হবে।

SQL সার্ভার 2019 এর প্রথম পাবলিক অন্তর্গত CTP, এটা শুধুমাত্র ট্রেস পতাকা 460. গোপন ধরনের শব্দসমূহ অধীনে পৃষ্ঠতল, কিন্তু এটা প্রকাশিত হয়েছে এই মাইক্রোসফট whitepaper । এটি হবে পূর্বনির্ধারিত আচরণ (কোনও ট্রেস ফ্ল্যাগের প্রয়োজন নেই), যদিও আপনি এটি একটি নতুন ডাটাবেস স্কোপ কনফিগারেশনের মাধ্যমে নিয়ন্ত্রণ করতে সক্ষম হবেন VERBOSE_TRUNCATION_WARNINGS

এখানে একটি উদাহরণ:

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

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

এসকিউএল সার্ভার 2019 এর আগে সমস্ত সমর্থিত সংস্করণে ফলাফল:

এমএসজি 8152, স্তর 16, রাজ্য 30, লাইন 5
স্ট্রিং বা বাইনারি ডেটা কেটে যাবে।
বিবৃতিতে বাতিল করা হয়েছে।

এখন, এসকিউএল সার্ভারে 2019 সিটিপিগুলিতে, ট্রেস পতাকাটি সক্ষম হয়েছে:

DBCC TRACEON(460);
GO

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

ফলাফলটি সারণী, কলাম এবং ( কাটা , পূর্ণ নয় ) মানটি দেখায় :

এমএসজি 2628, স্তর 16, রাজ্য 1, লাইন 11
স্ট্রিং বা বাইনারি ডেটা টেম্পল 'টেম্পড.বি.ডো.এক্স', কলাম 'এ' কেটে যাবে। কাটা মান: 'চ'।
বিবৃতিতে বাতিল করা হয়েছে।

যতক্ষণ না আপনি সমস্ত কিছু ফেলে রেখে এসকিউএল সার্ভার 2019 এ আপগ্রেড করতে পারেন বা অ্যাজুরে এসকিউএল ডাটাবেস এ সরাতে পারবেন না, আপনি নিজের "অটোমেজিক" কোডটি sys.columnsযেভাবেই যেভাবেই সেখানে পেয়ে যাবেন , সেই নামটি সহ, ম্যাক্স_লেন্থটি টানতে পারবেন এবং তারপরে প্রয়োগ LEFT(column, max_length)বা পিজির সমতুল্য যাই হোক না কেন। বা, যেহেতু এর অর্থ হ'ল আপনি নিঃশব্দে ডেটা হারাবেন, কোন কলামগুলি কী মিলছে না তা নির্ধারণ করুন এবং গন্তব্য কলামগুলি ঠিক করুন যাতে তারা উত্স থেকে সমস্ত ডেটা ফিট করে। উভয় সিস্টেমে মেটাডেটা অ্যাক্সেস দেওয়া হয়েছে এবং আপনি ইতিমধ্যে এমন একটি ক্যোয়ারী লিখেছেন যা স্বয়ংক্রিয়ভাবে উত্স -> গন্তব্য কলামগুলির সাথে মেলে (অন্যথায় এই ত্রুটিটি আপনার পক্ষে সবচেয়ে বড় সমস্যা হতে পারে), আপনাকে কোনও হিংস্র শক্তি প্রয়োগ করা উচিত নয় আদৌ অনুমান করা


2

যদি আপনার এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও থেকে এসকিউএল সার্ভার আমদানি এবং রফতানি উইজার্ড চালানোর অ্যাক্সেস থাকে (ডান ক্লিক করুন ডাটাবেস> টাস্ক> ডেটা আমদানি করুন ...), গন্তব্যে ডেটা উত্স হিসাবে আপনার কোয়েরিটি ব্যবহার করে এসকিউএল ক্লায়েন্ট থেকে আমদানি করে এমন একটি কাজ তৈরি করুন টেবিল।

আপনি আমদানি চালানোর আগে, আপনি ডেটা ম্যাপিং পর্যালোচনা করতে পারেন এবং এটি আপনাকে বলবে যে কোন কলামগুলিতে ক্ষেত্রের বেমানান রয়েছে। এবং আপনি যদি আমদানি টাস্কটি চালনা করেন তবে তা আপনাকে বলবে যে কোন কলাম (গুলি) আমদানি করতে ব্যর্থ হয়েছে।

নমুনা বৈধকরণ সতর্কতা:

সতর্কতা 0x802092a7: ডেটা ফ্লো টাস্ক 1: flow০ এর দৈর্ঘ্যের সাথে ডেটাবেস কলাম "NARRATIVE" এর 316 দৈর্ঘ্যের ডেটা ফ্লো কলাম "NARRATIVE" থেকে ডেটা toোকানোর কারণে ছাঁটাই হতে পারে ((এসকিউএল সার্ভার আমদানি ও রপ্তানি উইজার্ড)


1

শেষ পর্যন্ত, আমি নিজে না লিখে কলামের তথ্য পাওয়ার উপায় খুঁজে পাইনি।

এই ত্রুটি বার্তাটি উত্পন্ন হয়েছিল DBD::ODBC, আপনি তবে ব্যবহার করতে পারেন sys.columns (max_length)(কীভাবে আমি জানি না)।

আমি আমার কলামের তালিকায় এই জাতীয় কোডটি দুটি উপাদান, দ্য COLUMN_NAMEএবং MAX_LENGTH( ডিবিআইতেcolumn_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.colالms। গন্তব্য কলাম দৈর্ঘ্যের সাথে আপনার উত্স কলাম দৈর্ঘ্যের তুলনা করার জন্য আপনার ঠিক কোথায় দেখা উচিত। কীভাবে আপনি এটি আপনার উপর নির্ভর করে। আমি আপনাকে কীভাবে আপনার কোড ঠিক করব তা বলিনি, কারণ আপনার স্বয়ংক্রিয় জিজ্ঞাসাটি প্রথম স্থানে কীভাবে উত্পন্ন হয়েছিল তা সম্পর্কে আমার ঠিক ধারণা নেই, যেমনটি আমি বলেছিলাম, আপনার ইতিমধ্যে যে প্রশ্নটি রয়েছে তার দৈর্ঘ্য নির্ধারণ কীভাবে যুক্ত করবেন তার কোনও ধারণা ছিল না had ।
অ্যারন বারট্র্যান্ড

1

অবশেষে মাইক্রোসফট অর্থপূর্ণ তথ্য প্রদান করার সিদ্ধান্ত নিয়েছে জন্য String or binary would be truncatedSQL সার্ভার 2016 জন্য SP2 চবি, এসকিউএল সার্ভার 2017 CU12 থেকে এবং SQL সার্ভার 2019 সালে শুরু।

তথ্যটিতে এখন আপত্তিজনক টেবিল কলাম (পুরোপুরি যোগ্য নাম) এবং আপত্তিকর মান (120 টি অক্ষরে ছাঁটা) উভয়ই অন্তর্ভুক্ত রয়েছে:

এমএসজি 2628, স্তর 16, রাজ্য 1, লাইন এক্স স্ট্রিং বা বাইনারি ডেটা টেবিলের 'থিডিবি.সেসমা' দ্য টেবিল ', কলাম' দ্য কলম্বম 'কেটে যাবে। কাটা মান: '...'। বিবৃতিতে বাতিল করা হয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.