Érvénytelen karakterek és escape szabályok

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példánySQL-adatbázis a Microsoft Fabricben

Ez a cikk azt ismerteti, hogy a FOR XML záradék hogyan kezeli az érvénytelen XML-karaktereket, és felsorolja az XML-nevekben érvénytelen karakterek feloldó szabályait.

XML és érvénytelen karakterek esetén

Az SQL Server átalakítja az érvénytelen XML-karaktereket entitássá, amikor azokat visszakapjuk olyan XML-lekérdezéseknél, amelyek nem használják a TYPE direktívát.

Bár az XML 1.0-nak megfelelő elemzők elemzési hibákat okoznak függetlenül attól, hogy ezek a karakterek entitások-e vagy sem, az entitásalakzat jobban igazodik az XML 1.1-hez. Az entitásos űrlap az XML-szabvány későbbi verzióihoz is jobban igazodik. Emellett egyszerűbbé teszi a hibakeresést, mivel az érvénytelen karakter kódpontja láthatóvá válik.

Az XML-eszközök felhasználói számára nincs szükség kerülő megoldásra, mivel az XML-elemző mindkét esetben meghiúsul azon a ponton, ahol az adatstreamben érvénytelen karakterek fordulnak elő. Ha nem XML-eszközöket használ, a módosításhoz frissítenie kell a programozási logikát, hogy entitásértékekként keresse meg ezeket a karaktereket.

A FOR XML lekérdezésekben a következő szóköz karakterek másként vannak kódolva, hogy megőrizhessék jelenlétüket a körkörös feldolgozás során:

  • Elemtartalomban és attribútumokban: hex(0D) (kocsivissza)

  • Attribútumtartalomban: hex(09) (tab), hex(0A) (sorcsatorna)

Ezek a karakterek megmaradnak a kimenetben, és egy elemző nem normalizálja őket.

Menekülési szabályok

Az XML-nevekben (például szóközökben) érvénytelen karaktereket tartalmazó SQL Server-nevek xml-nevekké lesznek lefordítva oly módon, hogy az érvénytelen karaktereket a rendszer feloldott numerikus entitáskódolássá konvertálja.

Egy XML-névben csak két nem betűrendes karakter szerepelhet: a kettőspont (:) és az aláhúzásjel (_). Mivel a kettőspont már a névterek számára van fenntartva, az aláhúzásjelet választották kimenekítő karakterként. A kódoláshoz használt feloldó szabályok a következők:

  • Minden olyan UCS-2 karakter, amely nem érvényes XML-név karakter az XML 1.0 specifikációnak megfelelően, a _xHHHH_formában van lementve. A HHHH a karakter négyjegyű hexadecimális UCS-2 kódját jelöli a legfontosabb bit-első sorrendben. A Order Details táblanév például Order_x0020_Detailskódolva van.

  • Az UCS-2 tartományba nem illeszkedő karakterek (az U+00010000 és U+0010FFFF közötti UCS-4 tartománybővítések) _xHHHHHHHH_kódként kerülnek kódolásra. A HHHHHHHH a karakter nyolcjegyű hexadecimális UCS-4 kódolását jelenti, ha az SQL Server 2000 visszamenőleges kompatibilitási módban van. Ellenkező esetben a karakterek _xHHHHHH_kódolva vannak az ISO szabványnak megfelelően.

  • Az aláhúzásjelet csak akkor kell escape-elni, ha a xkarakter követi. A Order_Details táblanév például nincs kódolva.

  • Az azonosítók kettőspontja nem szökik meg. Ennek eredményeképpen a névtérelem és az attribútumnevek az XML-lekérdezéssel hozhatók létre. Az alábbi lekérdezés például létrehoz egy névtérattribútumot, amelynek nevében kettőspont szerepel:

    SELECT 'namespace-urn' as 'xmlns:namespace',
     1 as 'namespace:a'
    FOR XML RAW;
    

    A lekérdezés a következő eredményt hozza létre:

    <row xmlns:namespace="namespace-urn" namespace:a="1"/>
    

    Az „WITH XMLNAMESPACES” az XML-névterek hozzáadásának ajánlott módja.

Lásd még: