XML के लिए डेटा को क्रमबद्ध नहीं किया जा सकता है क्योंकि इसमें वर्ण (0x0000) है


18

मेरे पास एक बड़ी क्वेरी है (यदि आवश्यक हो तो मैं इसे यहां पोस्ट करूंगा) और मुझे यह त्रुटि मिल रही है:


XML के लिए Msg 6841, Level 16, State 1, Line 1 नोड 'NoName' के लिए डेटा को क्रमबद्ध नहीं कर सका क्योंकि इसमें एक वर्ण (0x0000) होता है जिसे XML में अनुमति नहीं है। XML के लिए इस डेटा को पुनः प्राप्त करने के लिए, इसे बाइनरी, वर्बिनरी या छवि डेटा प्रकार में कनवर्ट करें और BINARY BASE64 निर्देश का उपयोग करें।

मेरे द्वारा उपयोग किया जाने वाला एकमात्र भाग FOR XMLयहां है:

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

लेकिन, क्या है node noname? और मैं इस मूल्य की तलाश कैसे कर सकता हूं:(0x0000)

यह उपश्रेणियों में से एक है (मेरे पास XML के लिए एकमात्र भाग):

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) + '%';

यह आपकी क्वेरी में उन पंक्तियों को फ़िल्टर करने के लिए पर्याप्त नहीं है, क्योंकि आपको पता नहीं है कि XML विधि किस बिंदु पर काम करेगी, लेकिन आप यह भी देख सकते हैं:

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

बेशक, स्रोत डेटा को एक बार ठीक करना हर बार इन प्रतिस्थापित दिनचर्या को चलाने की तुलना में बहुत अधिक कुशल होगा

ध्यान दें, यह एकमात्र विशिष्ट वर्ण नहीं हो सकता है जो इस समस्या का कारण बनता है। 0x0001-> मैं 0x0008भी एक ही त्रुटि उत्पन्न करेगा। इसलिए यदि आपके पास वहां भी पात्र हैं, तो आपको जांच करनी चाहिए कि वे कहां से आ रहे हैं, और स्रोत को ठीक करें।


1
बहुत सारे इमोजीस वाले डेटा के बारे में क्या?
डेविनबॉस्ट

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अपने XML स्टेटमेंट से हटाना है।

दूसरा तरीका यह है कि उन पात्रों को चुनिंदा स्टेटमेंट में हटा दें:

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),'')

आप इन प्रतिस्थापित बयानों के साथ एक फ़ंक्शन भी बना सकते हैं।


इस वर्कअराउंड आइडिया से मुझे यह पता लगाने में मदद मिली कि एक बड़े कॉम्प्लेक्स कॉमन टेबल एक्सप्रेशन में जो कि xml ब्लॉक के लिए था, इस त्रुटि के साथ विफल हो रहा था।
कीथ जॉन हचिसन

2
यह स्क्रिप्ट उपयोगी है (हालांकि दर्दनाक रूप से धीमी है), लेकिन यह इमोजी पात्रों (जैसे 0xD83D) पर काम नहीं करता है, और मुझे संदेह है कि उनमें से बहुत कुछ हो सकता है .... कम से कम मेरे डेटा में। : '(या मुझे कहना चाहिए: 0x1F62D
devinbost

1

अनुवाद () (SQL Server 2017 ++) का उपयोग करके @jumxozizi से उत्तर का अनुकूलन। नीचे दिए गए कोड उन वर्णों को समय के साथ बदल देंगे।

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

इसके बजाय उन्हें पट्टी करने के लिए, कोई पहले (चार) उन्हें अनुवाद () कर सकता है और फिर एक प्रतिस्थापित () के साथ लपेट सकता है।

विचार से: /programming//a/55906638/538763

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