XML-Abfrage Anhängen der entsprechenden ID

Ich scheine Kampf mit XML. Ich schaue, um angemessene Identifikation zu jeder Reihe anzubringen

Declare @User table (id int,First_Name varchar(50),Last_Name varchar(50),EMail varchar(50)) Insert into @User values (1,'John','Smith','john.smith@gmail.com'), (2,'Jane','Doe' ,'jane.doe@gmail.com') Declare @XML xml Set @XML = (Select * from @User for XML RAW) Select ID = 1 -- < dummy need actual id ,Item = cast(xvquery('local-name(.)') as varchar(100)) ,Value = xvvalue('.','varchar(150)') From @xml.nodes('//@*') x(v) 

Mein aktuelles Ergebnis ist.

 ID Item Value 1 id 1 1 First_Name John 1 Last_Name Smith 1 EMail john.smith@gmail.com 1 id 2 1 First_Name Jane 1 Last_Name Doe 1 EMail jane.doe@gmail.com 

Mein gewünschtes Ergebnis wäre.

 ID Item Value 1 id 1 1 First_Name John 1 Last_Name Smith 1 EMail john.smith@gmail.com 2 id 2 2 First_Name Jane 2 Last_Name Doe 2 EMail jane.doe@gmail.com 

Versuchen Sie es so:

Btw: Du warst ganz nah!

 Declare @User table (id int,First_Name varchar(50),Last_Name varchar(50),EMail varchar(50)) Insert into @User values (1,'John','Smith','john.smith@gmail.com'), (2,'Jane','Doe' ,'jane.doe@gmail.com') Declare @XML xml Set @XML = (Select * from @User for XML RAW) SELECT @XML; /* <row id="1" First_Name="John" Last_Name="Smith" EMail="john.smith@gmail.com" /> <row id="2" First_Name="Jane" Last_Name="Doe" EMail="jane.doe@gmail.com" /> */ 

Die ersten .nodes() werden mit allen CROSS APPLY .nodes(./@*) in einzelnen Zeilen zurückgegeben. Die CROSS APPLY .nodes(./@*) wird eine CROSS APPLY .nodes(./@*) search nach allen Attributen durchführen und sie als einzelne Zeilen liefern.

 Select r.value('@id','int') AS ID ,Attr.value('local-name(.)','varchar(max)') AS Item ,Attr.value('.','varchar(max)') AS Value FROM @XML.nodes('/row') AS A(r) CROSS APPLY Arnodes('./@*') AS B(Attr) 

Ich bin gerade auf diese Frage gestoßen. Obwohl die Antwort auf diese Frage bereits gegeben wurde, dachte ich, es mit unterschiedlichem Ansatz zu beantworten, ohne xquery zu benutzen.

Sie können das gleiche Ergebnis mit CROSS APPLY und Table Value Constructor wie dieses erreichen –

 Declare @User table (id int,First_Name varchar(50),Last_Name varchar(50),EMail varchar(50)) Insert into @User values (1,'John','Smith','john.smith@gmail.com'), (2,'Jane','Doe' ,'jane.doe@gmail.com') SELECT r.ID, t.* FROM @User r CROSS APPLY ( VALUES ('ID', cast(id as varchar)), ('First_Name', First_Name), ('Last_Name', Last_Name), ('EMail', EMail) ) t(Item, Value) 

Ergebnis

 ID Item Value --------------------- 1 ID 1 1 First_Name John 1 Last_Name Smith 1 EMail john.smith@gmail.com 2 ID 2 2 First_Name Jane 2 Last_Name Doe 2 EMail jane.doe@gmail.com