এক্সএমএল জন্য ডেটা ক্রমিকায়িত করা যায়নি কারণ এতে অক্ষর রয়েছে (0x0000)


18

আমার একটি বড় প্রশ্ন রয়েছে (প্রয়োজনে আমি এটি এখানে পোস্ট করব) এবং আমি এই ত্রুটিটি পাচ্ছি:

এমএসজি 6841, স্তর 16, রাজ্য 1,
এক্সএমএলের জন্য লাইন 1 নোড 'ননাম' এর জন্য ডেটা ক্রমিক করতে পারেনি কারণ এতে একটি অক্ষর রয়েছে (0x0000) যা এক্সএমএলে অনুমোদিত নয়। ফরেক্স এক্সএমএল ব্যবহার করে এই ডেটাটি পুনরুদ্ধার করতে, এটি বাইনারি, ভেরিনারি বা চিত্রের ডেটা টাইপে রূপান্তর করুন এবং বিনারি BASE64 নির্দেশিকা ব্যবহার করুন।

আমি কেবলমাত্র FOR XMLএখানে ব্যবহার করছি:

WHERE 
    (CodFuncionario = Results.CodFuncionario) 
FOR XML PATH(''), TYPE).value('(./text())[1]', 
    'VARCHAR(MAX)'), 1, 2, '') AS [Experiencia]

তবে, কী node noname? এবং আমি এই মানটি কীভাবে সন্ধান করতে পারি:(0x0000)

এটি সাবকিউয়ের একটি (আমার কাছে এক্সএমএলের একমাত্র অংশ):

SELECT 
    [CodFuncionario],
    STUFF
    (
        (
            SELECT 
                ' / ' + 
            CAST
            (
                [DescFuncao] + '-' + 
                [DescTempoExperiencia] 
                AS VARCHAR(MAX)
            )...
FROM 
    [Linked_Server].db.dbo.tblFuncionarioExperiencia T0
INNER JOIN
    [Linked_Server].db.dbo.tblFuncao T1 On T0.codFuncao = T1.CodFuncao
INNER JOIN
    [Linked_Server].db.dbo.tblTempoExperiencia T2 ON T0.CodTempoExperiencia = T2.CodTempoExperiencia 
WHERE 
   (CodFuncionario = Results.CodFuncionario) 
   FOR XML PATH(''), TYPE).value('(./text())[1]', 'VARCHAR(MAX)'), 1, 2, '') AS [Experiencia]
  FROM 
      [Linked_Server].db.dbo.tblFuncionarioExperiencia Results  
  GROUP BY 
      CodFuncionario) as T2

  On T0.CodFuncionario = T2.CodFuncionario

Left Join...

উত্তর:


10

লাইন:

...
SELECT 
    [CodFuncionario],
    STUFF
    (
        (
            SELECT 
                ' / ' + 
                CAST
                (
                    [DescFuncao] + '-' + 
                    [DescTempoExperiencia] 
                    AS VARCHAR(MAX)
                )...

হতে হবে:

...
SELECT 
    [CodFuncionario],
    STUFF
    (
        (
            SELECT 
                ' / ' + 
                CAST
                (
                    replace -- *** NEW! ***
                    (
                        [DescFuncao] + '-' + 
                        [DescTempoExperiencia],
                        char(0),
                        ''
                    ) 
                    AS VARCHAR(MAX)
                )...

11

আমি যখন এটি করি তখন আমি একই ত্রুটি পাই:

DECLARE @foo VARCHAR(32) = CHAR(0); -- 0x0000
SELECT @foo FOR XML PATH, TYPE;

সুতরাং, DescFuncaoবা এর জন্য সমস্ত দৃষ্টান্ত সন্ধান করুন DescTempoExperiencia(দুঃখিত, আপনি টেবিল এলিয়াসিং ব্যবহার করেন না, সুতরাং তারা কোন টেবিলটি এসেছে তা বলা অসম্ভব) যেখানে সামগ্রীগুলি রয়েছে CHAR(0)এবং সেগুলি ঠিক করে। উদাহরণ স্বরূপ:

UPDATE dbo.whatever 
  SET DescFuncao = REPLACE(DescFuncao, CHAR(0), '')
  WHERE DescFuncao LIKE '%' + CHAR(0) + '%';

আপনার ক্যোয়ারিতে এই সারিগুলি ফিল্টার করার পক্ষে যথেষ্ট নয়, কারণ এক্সএমএল পদ্ধতিগুলি কোন সময়ে কাজ করবে তা আপনি জানেন না, তবে আপনি চেষ্টাও করতে পারেন:

STUFF(( SELECT ' / ' + CAST(REPLACE([DescFuncao] + '-' 
  + [DescTempoExperiencia], CHAR(0), '') AS VARCHAR(MAX))

অবশ্যই, উত্স ডেটা একবারে ঠিক করা প্রতিবার এই প্রতিস্থাপনের রুটিনগুলি চালানোর চেয়ে অনেক বেশি দক্ষ হবে ।

দ্রষ্টব্য, এটি কেবলমাত্র নির্দিষ্ট চরিত্রই না হতে পারে যা এই সমস্যার কারণ হতে পারে। 0x0001-> 0x0008একই ত্রুটি উত্পন্ন করবে। সুতরাং সেখানেও যদি আপনার এই চরিত্রগুলি থাকে তবে আপনার কোথা থেকে আসছেন তা খতিয়ে দেখা উচিত এবং উত্সটি ঠিক করা উচিত।


1
প্রচুর ইমোজি সহ ডেটা সম্পর্কে কী?
devinbost

10

আমি ASCII অক্ষর 0-255 সঙ্গে এই পরীক্ষা খুঁজে পাওয়া যায় নি যে আপনার অক্ষরের জন্য এই ত্রুটি পাবেন: 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x000B, 0x000C, 0x000E, 0x000F, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F

, TYPEআপনার এক্সএমএল স্টেটমেন্ট থেকে অপসারণ করা এক কাজ ।

আরেকটি উপায় হ'ল নির্বাচিত বিবৃতিতে এই অক্ষরগুলি সরিয়ে ফেলা:

REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( 
REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( 
REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( 
REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( 
REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( 
REPLACE( REPLACE( REPLACE( REPLACE( 
    < YOUR EXPRESSION TO BE CLEANED >
,char(0x0000),'') ,char(0x0001),'') ,char(0x0002),'') ,char(0x0003),'') ,char(0x0004),'') 
,char(0x0005),'') ,char(0x0006),'') ,char(0x0007),'') ,char(0x0008),'') ,char(0x000B),'') 
,char(0x000C),'') ,char(0x000E),'') ,char(0x000F),'') ,char(0x0010),'') ,char(0x0011),'') 
,char(0x0012),'') ,char(0x0013),'') ,char(0x0014),'') ,char(0x0015),'') ,char(0x0016),'') 
,char(0x0017),'') ,char(0x0018),'') ,char(0x0019),'') ,char(0x001A),'') ,char(0x001B),'') 
,char(0x001C),'') ,char(0x001D),'') ,char(0x001E),'') ,char(0x001F),'')

আপনি এই প্রতিস্থাপন বিবৃতি দিয়ে একটি ফাংশন তৈরি করতে পারে।


এই কার্যকর ধারণাটি আমাকে এটি খুঁজে পেতে সহায়তা করেছিল যে একটি বৃহত জটিল সাধারণ টেবিল এক্সপ্রেশন যেখানে এক্সএমএল ব্লকের জন্য এই ত্রুটিটি ব্যর্থ হয়েছিল।
কীথ জন হাচিসন

2
এই স্ক্রিপ্টটি দরকারী (যদিও বেদনাদায়ক ধীর গতিতে), তবে এটি ইমোজি অক্ষরগুলিতে (যেমন 0xD83D) তে কাজ করে না, এবং আমি সন্দেহ করি যে এগুলির অনেকগুলি থাকতে পারে .... অন্তত আমার ডেটাতে। : '(অথবা আমি বলব: 0x1F62D
ডেভিনিস্ট

1

অনুবাদ () (এসকিউএল সার্ভার 2017 ++) ব্যবহার করে @ জুমক্সোজিজির কাছ থেকে উত্তর অনুকূল করা। নীচের কোডটি পিরিয়ড সহ এই অক্ষরগুলি প্রতিস্থাপন করবে।

declare
    @illegalChars nvarchar(4000) = 
        char(0) + char(1) + char(2) + char(3) + char(4) + char(5) + char(6) + char(7) + char(8) + char(11) + 
        char(12) + char(14) + char(15) + char(16) + char(17) + char(18) + char(19) + char(20) + char(21) + char(22) + 
        char(23) + char(24) + char(25) + char(26) + char(27) + char(28) + char(29) + char(30) + char(31);

select translate(input, @illegalChars, replicate('.', len(@illegalChars))) as Result

পরিবর্তে এগুলি ফালা ফেলার জন্য, কেউ প্রথমে তাদের () প্রথমে (0) অনুবাদ করতে পারে এবং তারপরে এটি প্রতিস্থাপন () দিয়ে মোড়ানো করতে পারে।

ধারণা থেকে: /programming//a/55906638/538763

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