Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL Server 2012:Hierarchiczne dane XML — znaki ucieczki

Twoje problemy:

  1. Próbujesz użyć wyjścia SelectChild , który jest typu XML, jako treść atrybutu @ListDirectChildren . W tym miejscu nie można używać XML, dlatego jest on traktowany (i zmieniany) jak zwykły tekst. Czy próbujesz utworzyć rodzaj rekurencyjnej listy podrzędnej?

  2. W swoim zewnętrznym zapytaniu rzutujesz XML na VARCHAR(MAX) (btw:używaj zawsze NVARCHAR w połączeniu z XML). Znowu zmusisz silnik do traktowania tego tekstu jako tekstu, a tym samym do jego ucieczki.

  3. Próbujesz dodać ciąg „null”, aby wyrazić brak wartości. Ale XML działa inaczej:a. Elementu całkowicie brakuje w XML:zapytanie zwróci NULL , w porządku.

    b. W przypadku niektórych reguł element musi tam być, ale powinien być pusty:
    <ListDirectChildren></ListDirectChildren> lub <ListDirectChildren /> (co oznacza dokładnie to samo). Zapytaj text() węzła i otrzymujesz NULL , to też jest w porządku.

    c. W przypadku niektórych reguł chcesz oznaczyć element jako NULL . Użyj XSINIL

Wypróbuj to dla odmian empty i null :

DECLARE @x XML=
'<root>
   <testempty1 />
   <testempty2></testempty2>
 </root>';

SELECT @x.value('(/root/testempty1)[1]','nvarchar(max)') AS testempty1_Content
      ,@x.value('(/root/testempty1/text())[1]','nvarchar(max)') AS testempty1_Text
      ,@x.value('(/root/testempty2)[1]','nvarchar(max)') AS testempty2_Content
      ,@x.value('(/root/testempty2/text())[1]','nvarchar(max)') AS testempty2_Text
      ,@x.value('(/root/NotExistingElement)[1]','nvarchar(max)') AS NotExistingElement_Content
      ,@x.value('(/root/NotExistingElement/text())[1]','nvarchar(max)') AS NotExistingElement_Text

Wynik:

                   Content  Text
testempty1         ""       NULL
testempty2         ""       NULL
NotExistingElement NULL     NULL

Wypróbuj dla XSINIL

SELECT NULL AS test FOR XML RAW, ELEMENTS XSINIL

aby to zdobyć

<row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <test xsi:nil="true" />
</row>

Moja sugestia:

To pytanie

miejmy nadzieję, że rozwiązany. Rozpocznij nowe pytanie, w którym dodasz więcej danych do przykładowego scenariusza, aby odzwierciedlić wiele dzieci, umieść link do tego pytania i określ oczekiwany wynik (jak powinien wyglądać XML).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Funkcja a procedura składowana w SQL Server

  2. Wyraźne losowe generowanie czasu w ustalonym interwale

  3. Przetwarzaj JSON w TSQL

  4. Jak mogę przenieść bazę danych SQL Server LocalDb z jednego komputera na inny?

  5. Jak podejść do misji ETL?