Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server 2012:Hierarchische XML-Daten – Escape-Zeichen

Ihre Probleme:

  1. Sie versuchen, die Ausgabe von SelectChild zu verwenden , die vom Typ XML ist, als Inhalt des Attributs @ListDirectChildren . Sie können XML an dieser Stelle nicht verwenden, daher wird es als normaler Text behandelt (und maskiert). Versuchen Sie, eine Art rekursive untergeordnete Liste zu erstellen?

  2. In Ihrer äußeren Abfrage wandeln Sie das XML in VARCHAR(MAX) um (Übrigens:verwende immer NVARCHAR in Verbindung mit XML). Auch hier zwingen Sie die Engine, diesen Text als Text zu behandeln und ihn daher zu maskieren.

  3. Sie versuchen, die Zeichenfolge "null" hinzuzufügen, um das Fehlen eines Werts auszudrücken. Aber XML funktioniert anders:a. Das Element fehlt im XML vollständig:Die Abfrage liefert NULL zurück , das ist in Ordnung.

    b. Für einige Regeln muss das Element vorhanden sein, sollte aber leer sein:
    <ListDirectChildren></ListDirectChildren> oder <ListDirectChildren /> (was genau dasselbe bedeutet). Fragen Sie den text() des Knotens ab und Sie erhalten NULL , das ist auch in Ordnung.

    c. Für einige Regeln möchten Sie das Element als NULL markieren . Verwenden Sie XSINIL

Versuchen Sie dies für Variationen von empty und 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

Das Ergebnis:

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

Versuchen Sie dies für XSINIL

SELECT NULL AS test FOR XML RAW, ELEMENTS XSINIL

um das zu bekommen

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

Mein Vorschlag:

Diese Frage

ist hoffentlich gelöst. Bitte beginnen Sie eine neue Frage, in der Sie Ihrem Beispielszenario weitere Daten hinzufügen, um mehrere Kinder widerzuspiegeln, einen Link zu dieser Frage platzieren und die erwartete Ausgabe angeben (wie das XML aussehen soll).