wähle alle aus XML in sql

Wie wähle ich alle Knoten aus einem XML in SQL aus?

XML:

<value> <TradeId>5555</TradeId> <Account>SomeAccount</Account> <Book>1</Book> <LocalCcy>XXXX</LocalCcy> <ValuationCcy>XXXX</ValuationCcy> <PVLocal>44444444</PVLocal> <PresentValue>44444444</PresentValue> <InstrumentCode>XXXXXXXXX</InstrumentCode> </value> 

Mein SQL (das funktioniert nicht):

 SELECT tradeRef.value('.','varchar(50)') AS strValue FROM @xmlData.nodes('data/value') AS trades(tradeRef) CROSS APPLY tradeRef.nodes('.') AS legColumns(nameRef) 

Das gibt mir alle Werte aber in einer Reihe … Ich möchte eine Zeile pro Wert ..

Kannst du mir helfen?

BEARBEITEN:

Angeforderte Ausgabe (nur zwei erste Knoten hier …): Bildbeschreibung hier eingeben

Sie können diesen Ansatz ausprobieren:

 declare @xmlData xml select @xmlData = '<data><value> <TradeId>5555</TradeId> <Account>SomeAccount</Account> <Book>1</Book> <LocalCcy>XXXX</LocalCcy> <ValuationCcy>XXXX</ValuationCcy> <PVLocal>44444444</PVLocal> <PresentValue>44444444</PresentValue> <InstrumentCode>XXXXXXXXX</InstrumentCode> </value></data>' select tcvalue('./text()[1]', 'nvarchar(100)') as strValue from @xmlData.nodes('//value/child::node()') as t(c) 

Mögliche Möglichkeit, diese Ausgabe mit CROSS APPLY :

 declare @xmlData XML set @xmlData = '<value> <TradeId>5555</TradeId> <Account>SomeAccount</Account> <Book>1</Book> <LocalCcy>XXXX</LocalCcy> <ValuationCcy>XXXX</ValuationCcy> <PVLocal>44444444</PVLocal> <PresentValue>44444444</PresentValue> <InstrumentCode>XXXXXXXXX</InstrumentCode> </value>' select PXvalue('.', 'int') as TradeId ,TXvalue('local-name(.)', 'nvarchar(100)') as NodeName ,TXvalue('.', 'nvarchar(100)') as NodeValue from @xmlData.nodes('//value/*[not(local-name()="TradeId")]') as T(X) cross apply TXnodes('../TradeId') as P(X) 

SQL-Geige

Wenn du TradeId als Spalte sehen TradeId und nicht als eine Zeile sehen willst:

 select tcvalue('(TradeId/text())[1]', 'nvarchar(100)') as TradeId, rcvalue('local-name(.)', 'nvarchar(128)') as nodeName, rcvalue('text()[1]', 'nvarchar(100)') as strValue from @data.nodes('data/value') as t(c) cross apply tcnodes('*[local-name(.) != "TradeId"]') as r(c) 

Oder du kannst die übergeordnete Achse benutzen (obwohl es normalerweise schlechter ausführt):

 select tcvalue('(../TradeId/text())[1]', 'nvarchar(128)') as TradeId, tcvalue('local-name(.)', 'nvarchar(128)') as nodeName, tcvalue('text()[1]', 'nvarchar(128)') as nodeValue from @data.nodes('data/value/*[local-name(.) != "TradeId"]') as t(c)