2017-02-02 10 views
0

Ich habe eine alte SQL Server-Tabelle, die eine varchar(2056) Spalte hat, in der jede Zeile diskrete "Elemente" von XML enthält. Gibt es eine Möglichkeit, diese mit T-SQL in echtes XML umzuwandeln?So wählen Sie aus diskreten Varchar-Elementen als XML aus?

Dies gibt Ihnen eine Vorstellung davon, was mit denen ich zu tun:

declare @xmlTable table(
    Value varchar(2056) 
) 

insert into @xmlTable 
values ('<Root>'), 
     (' <Child id="1">'), 
     (' <Name>Sam</Name>'), 
     (' </Child>'), 
     (' <Child />'), 
     ('</Root>') 

Das Problem ist, dass jedes Element auf einer eigenen Zeile in der Tabelle ist, und zum Öffnen/Schließen-Tags können auseinander mehrere Reihen sein. Ich habe versucht, in XML zu konvertieren, aber da jede Zeile kein gültiges XML ist, schlägt dies fehl. Ich habe auch den alten "select column to CSV using for XML" Trick versucht (um eine Schnur zu schaffen, die ich werfen könnte), aber das wandelt mein ">" in "& gt;" etc.

Ich benutze SQL Server 2012, und diese bestimmte Tabelle hat über 650.000 Zeilen verteilt auf 560 "Dokumente". Ich möchte in der Lage sein, etwas zu sagen wie:

select Value 
from @xmlTable 
for xml path(''), type 

und geben Sie schöne Brocken von abfragbaren XML zurück.

Danke!

+0

Whoops! Ich benutze SQL 2012, nicht 2014. –

Antwort

1

es so versuchen:

declare @xmlTable table(
    Value varchar(2056) 
) 

insert into @xmlTable 
values ('<Root>'), 
     (' <Child id="1">'), 
     (' <Name>Sam</Name>'), 
     (' </Child>'), 
     (' <Child />'), 
     ('</Root>'); 

SELECT CAST 
(
    (
    SELECT Value AS [*] 
    FROM @xmlTable 
    FOR XML PATH(''),TYPE 
    ).value('.','nvarchar(max)') 
AS XML); 

Ihr Problem mit der Zeichenfolge und die darin enthaltenen Flucht Einheiten von ,TYPE Verwendung gelöst wird und danach den value() -Methode. Auf diese Weise werden alle maskierten Zeichen implizit zurückgemeldet.

+0

Ja, das funktioniert! Zumindest bei den Beispieldaten werde ich es bald auf den Big Data versuchen. Die großen Daten sind alles CDATA [] Zeug, hoffentlich wird das kein Problem verursachen. Ich habe nie "als [*]" gesehen. Was genau macht das? –

+0

@ emery.noel 1) 'CDATA'-Abschnitte stören nicht, werden aber in * normal maskierte Abschnitte * übersetzt. Dies sollte keinen Unterschied machen ... 2) 'as [*]' ist eine von vielen Möglichkeiten, eine unbenannte Spalte zu erzwingen. Andernfalls würde das generierte XML die benannten Elemente enthalten 3) Thx für die Annahme! Nur ein winziger Hinweis: Wenn Sie das mögen, stimmen Sie vielleicht auch über die Antwort ab. Wählen und Akzeptieren sind zwei verschiedene Schritte auf SO ... Happy Coding! – Shnugo

+0

Lol Ich habe zu schnell geklickt. Jetzt abgestimmt. Die CDATA loszuwerden ist nur ein zusätzlicher Bonus. Dies funktioniert perfekt auf unserem neuesten "Dokument" ... jetzt um zu sehen, ob ich sie alle auf einmal bekommen kann! Danke nochmal! –

Verwandte Themen