Frage Verketten Sie XML, ohne Typ in String zu übergeben


Ich habe den folgenden XML-Code aus verschiedenen Tabellen in meiner SQL SERVER-Datenbank generiert

<XMLData>
...
<Type>1</Type>
...
</XMLData>

UND

<XMLData>
...
<Type>2</Type>
...
</XMLData>

UND

<XMLData>
...
<Type>3</Type>
...
</XMLData>

Die endgültige Ausgabe, die ich brauche, ist wie folgt kombiniert:

<AllMyData>
    <XMLData>
        ...
        <Type>1</Type>
        ...
    </XMLData>
    <XMLData>
        ...
        <Type>2</Type>
        ...
    </XMLData>
    <XMLData>
        ...
        <Type>3</Type>
        ...
    </XMLData>
<AllMyData>

HINWEIS - alle unabhängigen Elemente, die ich kombiniere, haben denselben Tag-Namen.

Danke im Voraus für das Nachschlagen.


15
2017-07-28 09:41


Ursprung


Antworten:


Ich habe den folgenden XML-Code aus verschiedenen Tabellen in meinem SQL generiert   Serverdatenbank

Sch sch Da sch Da sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch Bitte sch sch sch sch sch sch sch sch sch sch sch sch sch sch dieser sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch dieser

declare @XML1 xml
declare @XML2 xml
declare @XML3 xml

set @XML1 = '<XMLData><Type>1</Type></XMLData>'
set @XML2 = '<XMLData><Type>2</Type></XMLData>'
set @XML3 = '<XMLData><Type>3</Type></XMLData>'

select @XML1, @XML2, @XML3 
for xml path('AllMyData')

16
2017-07-28 09:58



Ich kann nichts sagen, aber ich kann antworten, obwohl ich denke, dass ein Kommentar passender ist. Ich werde weiter ausführen, was rainabba oben beantwortet hat, um ein bisschen mehr Kontrolle hinzuzufügen. Mein .Net-Code muss den zurückgegebenen Spaltennamen kennen, damit ich mich nicht auf automatisch generierte Namen verlassen kann, sondern die oben genannte Tipp-Rainabba benötigt.

Sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch Da sch sch sch sch sch sch Da sch sch Da sch sch sch sch sch sch Da sch sch sch dieser Sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch sch dieser sch sch Da Da Da dieser

SELECT (
 SELECT XmlData as [*]
 FROM
     (
     SELECT
         xmlResult AS [*]
     FROM
         @XmlRes
     WHERE
         xmlResult IS NOT NULL
     FOR XML PATH(''), TYPE
     ) as DATA(XmlData)
 FOR XML PATH('')
) as [someColumnName]

6
2017-10-01 00:47



Wenn du benutzt for xml type, können Sie die XML-Spalten kombinieren, ohne sie zu übertragen. Beispielsweise:

select  *
from    (
        select  (
                select  1 as Type
                for xml path(''), type
                )
        union all
        select  (
                select  2 as Type
                for xml path(''), type
                )
        union all
        select  (
                select  3 as Type
                for xml path(''), type
                )
        ) as Data(XmlData)
for xml path(''), root('AllMyData'), type

Dies druckt:

<AllMyData>
    <XmlData>
        <Type>1</Type>
    </XmlData>
    <XmlData>
        <Type>2</Type>
    </XmlData>
    <XmlData>
        <Type>3</Type>
    </XmlData>
</AllMyData>

5
2017-07-28 09:49



Als Ergänzung zu Mikael Erikssons Antwort - Wenn Sie einen Prozess haben, bei dem Sie ständig Knoten hinzufügen müssen und diese dann unter einem einzigen Knoten gruppieren möchten, ist dies eine Möglichkeit:

declare @XML1 XML
declare @XML2 XML
declare @XML3 XML
declare @XMLSummary XML

set @XML1 = '<XMLData><Type>1</Type></XMLData>'
set @XMLSummary = (SELECT @XMLSummary, @XML1 FOR XML PATH(''))

set @XML2 = '<XMLData><Type>2</Type></XMLData>'
set @XMLSummary = (SELECT @XMLSummary, @XML2 FOR XML PATH(''))

set @XML3 = '<XMLData><Type>3</Type></XMLData>'
set @XMLSummary = (SELECT @XMLSummary, @XML3 FOR XML PATH(''))


SELECT @XMLSummary FOR XML PATH('AllMyData')

3
2018-02-26 16:03



Ich musste das Gleiche tun, aber ohne zu wissen, wie viele Zeilen / Variablen betroffen waren und ohne dass ein zusätzliches Schema hinzugefügt wurde, hier war meine Lösung. Nach diesem Muster kann ich beliebig viele Snippets generieren, kombinieren, zwischen PROCS übergeben oder sogar aus Procs zurückgeben und sie zu einem beliebigen Zeitpunkt in Container umhüllen, ohne die Daten zu verändern oder die XML-Struktur hinzufügen zu müssen meine Daten. Ich verwende diesen Ansatz mit HTTP-Endpunkten, um XML-Webdienste bereitzustellen, und einen weiteren Trick, der XML in JSON konvertiert, um JSON-Webdienste bereitzustellen.

    -- SETUP A type (or use this design for a Table Variable) to temporarily store snippets into. The pattern can be repeated to pass/store snippets to build
    -- larger elements and those can be further combined following the pattern.
    CREATE TYPE [dbo].[XMLRes] AS TABLE(
        [xmlResult] [xml] NULL
    )
    GO


    -- Call the following as much as you like to build up all the elements you want included in the larger element
    INSERT INTO @XMLRes ( xmlResult )
        SELECT
            (    
                SELECT
                    'foo' '@bar'
                FOR XML
                    PATH('SomeTopLevelElement')
            )

    -- This is the key to "concatenating" many snippets into a larger element. At the end of this, add " ,ROOT('DocumentRoot') " to wrapp them up in another element even
    -- The outer select is a time from user2503764 that controls the output column name

   SELECT (
    SELECT XmlData as [*]
    FROM
        (
        SELECT
            xmlResult AS [*]
        FROM
            @XmlRes
        WHERE
            xmlResult IS NOT NULL
        FOR XML PATH(''), TYPE
        ) as DATA(XmlData)
    FOR XML PATH('')
   ) as [someColumnName]

1
2017-10-01 00:17



ALTER PROCEDURE usp_fillHDDT @Code  int

AS
BEGIN

 DECLARE @HD XML,@DT XML;  

    SET NOCOUNT ON;
    select invhdcode, invInvoiceNO,invDate,invCusCode,InvAmount into #HD
    from dbo.trnInvoiceHD where invhdcode=@Code

    select invdtSlNo No,invdtitemcode ItemCode,invdtitemcode ItemName,
    invDtRate Rate,invDtQty Qty,invDtAmount Amount ,'Kg' Unit into #DT from
     dbo.trnInvoiceDt  where invDtTrncode=@Code 

    set @HD = (select * from #HD HD  FOR XML AUTO,ELEMENTS XSINIL);
    set @DT = (select* from #DT DT FOR XML AUTO,ELEMENTS XSINIL);

    SELECT CAST ('<OUTPUT>'+ CAST (ISNULL(@HD,'') AS VARCHAR(MAX))+ CAST ( ISNULL(@DT,'') AS VARCHAR(MAX))+ '</OUTPUT>'   AS XML)

END

0
2018-03-23 21:04



public String ReplaceSpecialChar(String inStr)
{
    inStr = inStr.Replace("&", "&amp;");
    inStr = inStr.Replace("<", "&lt;");
    inStr = inStr.Replace(">", "&gt;");
    inStr = inStr.Replace("'", "&#39;");
    inStr = inStr.Replace("\"", "&quot;");
    return inStr;
}

-1
2018-03-25 04:04