Udostępnij za pośrednictwem


Nieprawidłowe znaki i reguły ucieczki

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

W tym artykule opisano sposób obsługi nieprawidłowych znaków XML przez klauzulę FOR XML i wymieniono reguły ucieczki znaków, które są nieprawidłowe w nazwach XML.

"FOR XML i znaki nieprawidłowe"

Program SQL Server tworzy nieprawidłowe znaki XML, gdy są zwracane w zapytaniach FOR XML, które nie używają dyrektywy TYPE.

Mimo że analizatory zgodne z XML 1.0 zgłaszają błędy analizy niezależnie od tego, czy te znaki są zaposkryptowane, czy nie, forma zaposkryptowana jest lepiej dopasowana do standardu XML 1.1. Forma upostaciowana jest również potencjalnie lepiej dopasowana do przyszłych wersji standardu XML. Ponadto ułatwia debugowanie, ponieważ punkt kodu nieprawidłowego znaku staje się widoczny.

W przypadku użytkowników narzędzi XML nie jest wymagane obejście, ponieważ analizator XML zakończy się niepowodzeniem w obu przypadkach, w którym nieprawidłowe znaki występują w strumieniu danych. Jeśli używasz narzędzi innych niż XML, ta zmiana może wymagać zaktualizowania logiki programowania w celu wyszukania tych znaków jako wartości ztytułowanych.

Następujące białe znaki są przekształcane na encje inaczej w zapytaniach FOR XML, aby zachować ich obecność w obiegu danych:

  • W zawartości i atrybutach elementu: hex(0D) (znak powrotu)

  • W zawartości atrybutu: hex(09) (karta), hex(0A) (przerwa wiersza)

Te znaki są zachowywane w danych wyjściowych, a analizator nie będzie je normalizować.

Reguły ucieczki

Nazwy programu SQL Server, które zawierają nieprawidłowe znaki w nazwach XML, takie jak spacje, są tłumaczone na nazwy XML w sposób, w jaki nieprawidłowe znaki są tłumaczone na kodowanie jednostki liczbowej ucieczki.

Istnieją tylko dwa znaki inne niż alfabetyczne, które mogą występować w nazwie XML: dwukropek (:) i podkreślenie (_). Ponieważ dwukropek jest już zarezerwowany dla przestrzeni nazw, podkreślenie jest wybierane jako znak ucieczkowy. Poniżej przedstawiono reguły escape stosowane w kodowaniu:

  • Każdy znak UCS-2, który nie jest prawidłowym znakiem nazwy XML, zgodnie ze specyfikacją XML 1.0, jest zapisywany jako _xHHHH_. HHHH oznacza czterocyfrowy kod szesnastkowy UCS-2 dla znaku w najbardziej znaczącej kolejności bitów. Na przykład nazwa tabeli Order Details jest kodowana jako Order_x0020_Details.

  • Znaki, które nie mieszczą się w obszarze UCS-2 (dodatki UCS-4 zakresu U+00010000 do U+0010FFFF) są kodowane jako _xHHHHHHHH_. W trybie zgodności z SQL Server 2000 HHHHHHHH oznacza ośmiocyfrowe szesnastkowe kodowanie UCS-4 znaku. W przeciwnym razie znaki są kodowane jako _xHHHHHH_, aby dopasować je do standardu ISO.

  • Znak podkreślenia nie musi zostać uniknięty, chyba że następuje po nim znak x. Na przykład nazwa tabeli Order_Details nie jest zakodowana.

  • Dwukropek w identyfikatorach nie jest usuwany. W związku z tym element przestrzeni nazw i nazwy atrybutów mogą być generowane przez zapytanie FOR XML. Na przykład następujące zapytanie generuje atrybut przestrzeni nazw, który ma dwukropek w nazwie:

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

    Zapytanie generuje ten wynik:

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

    Użycie XMLNAMESPACES jest zalecanym sposobem dodawania przestrzeni nazw XML.

Zobacz też