2017-06-22 5 views
1

Halo All halten,UNION Mit doppeltem Datum zu entfernen, aber die gleichen Daten

Ich hoffe, dass Sie mir helfen kann. Ich benutze SQL Server. Ich habe diese XML-Daten wie folgt aus:

<Root> 
    <Header> 
    <refNo>S350282535-100060</refNo> 
    <doNumber>0</doNumber> 
    </Header> 
    <Header> 
    <refNo>S350282535-100061</refNo> 
    <doNumber>1</doNumber> 
    </Header> 
    <Detail> 
    <item>114495</item> 
    <qty>2</qty> 
    <uom>PC</uom> 
    <refNo>S350282535-100060</refNo> 
    <remarks>-</remarks> 
    <reason>-</reason> 
</Detail> 
<Detail> 
    <item>114496</item> 
    <qty>2</qty> 
    <uom>PC</uom> 
    <refNo>S350282535-100061</refNo> 
    <remarks>-</remarks> 
    <reason>-</reason> 
</Detail> 
<Detail> 
    <item>114497</item> 
    <qty>2</qty> 
    <uom>PC</uom> 
    <refNo>S350282535-100061</refNo> 
    <remarks>-</remarks> 
    <reason>-</reason> 
</Detail> 
</Root> 

, wie ich diese Art von Daten bekommen:

refNo     doNumber Item  qty uom 
-------------------------------------------------------------------- 
S350282535-100060  0   114495  2  PC 
S350282535-100061  1   114496  2  PC 
S350282535-100061  1   114497  2  PC 

hier ist meine Fragen, die ich habe bereits versucht:

DECLARE @XML AS XML, @hDoc AS INT, @SQL NVARCHAR (MAX), @flagParameter AS 
INT 

SELECT @XML = XMLData FROM XMLwithOpenXML 

EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML 
SET @flagParameter = 2 

SELECT item, qty,uom, refNo, remarks, reason 
FROM OPENXML(@hDoc, 'Root/Detail',@flagParameter) 
WITH 
(
    item [int], 
    qty [int], 
    uom [nvarchar] (6), 
    refNo [nvarchar] (50), 
    remarks [nvarchar] (100), 
    reason [nvarchar] (100) 
) 

SELECT refNo, doNumber 
FROM OPENXML(@hDoc, 'Root/Header',@flagParameter) 
WITH 
(
refNo [nvarchar](50), 
doNumber [int] 
) 

SELECT refNo , doNumber, item--, qty,uom, remarks, reason 
FROM OPENXML(@hDoc, 'Root/Detail',@flagParameter) 
WITH 
(
refNo [nvarchar] (50), 
doNumber [int], 
item [int], 
qty [int], 
uom [nvarchar] (6), 
remarks [nvarchar] (100), 
reason [nvarchar] (100) 
) 

UNION 

SELECT refNo, doNumber, One as Item--, two as two, three as three, four as 
four 
FROM OPENXML(@hDoc, 'Root/Header',@flagParameter) 
WITH 
(
refNo [nvarchar](50), 
doNumber [int], 
one [int], 
two [int], 
three [int], 
four [int] 
) EXEC sp_xml_removedocument @hDoc 

i verwenden UNION, aber das Ergebnis war nicht so wie ich es erwartet hatte, kann mir jemand helfen? Ich schätze deine Hilfe.

+1

Würden Sie bitte Ihre UNION-Abfrage teilen, die Sie versuchen? –

+0

ja, sicher @keyur: – AgusmanPriantoro

+0

ich habe meine Fragen bei meinem Post hinzugefügt. @keyur – AgusmanPriantoro

Antwort

0

Unter der Annahme, dass die XML-Daten in einer XML-Variablen @xml Namen gespeichert ist:

DECLARE @xml XML = '<Root> 
    <Header> 
    <refNo>S350282535-100060</refNo> 
    <doNumber>0</doNumber> 
    </Header> 
    <Header> 
    <refNo>S350282535-100061</refNo> 
    <doNumber>1</doNumber> 
    </Header> 
    <Detail> 
    <item>114495</item> 
    <qty>2</qty> 
    <uom>PC</uom> 
    <refNo>S350282535-100060</refNo> 
    <remarks>-</remarks> 
    <reason>-</reason> 
</Detail> 
<Detail> 
    <item>114496</item> 
    <qty>2</qty> 
    <uom>PC</uom> 
    <refNo>S350282535-100061</refNo> 
    <remarks>-</remarks> 
    <reason>-</reason> 
</Detail> 
<Detail> 
    <item>114497</item> 
    <qty>2</qty> 
    <uom>PC</uom> 
    <refNo>S350282535-100061</refNo> 
    <remarks>-</remarks> 
    <reason>-</reason> 
</Detail> 
</Root>' 

die folgende ist ein möglicher Weg, das erwartete Ergebnis mit XML methods zu bekommen und XPath/XQuery anstelle des älteren OPENXML:

;WITH Header(refNo, doNumber) 
AS 
(
    SELECT 
     T.C.value('refNo[1]', 'varchar(100)') 
     ,T.C.value('doNumber[1]', 'int') 
    FROM @xml.nodes('/Root/Header') AS T(C) 
) 

SELECT 
    Header.* 
    ,T.C.value('item[1]', 'varchar(100)') 'item' 
    ,T.C.value('qty[1]', 'int') 'qty' 
    ,T.C.value('uom[1]', 'varchar(100)') 'uom' 
FROM @xml.nodes('/Root/Detail') AS T(C) 
INNER JOIN Header on T.C.value('refNo[1]', 'varchar(100)') = refNo 

demo

+0

Vielen Dank, und es funktioniert wie eine Magie. – AgusmanPriantoro

+0

@AgusmanPriantoro Sie sind herzlich willkommen. Da Sie es bisher noch nie getan haben, möchte ich Sie daran erinnern, eine Antwort zu akzeptieren (https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work), wenn es so ist löste das Problem in Frage. – har07

Verwandte Themen