2009-12-11 4 views
6

Ich habe zwei XML-Variable sagen @res, @student in einer gespeicherten proc in SQL Server 2005Wie man xml mit XQuery in einen Knoten in einem anderen XML einfügt?

@res enthält

<Subject>English</Subject> 
<Marks>67</Marks> 
<Subject>Science</Subject> 
<Marks>75</Marks> 

@student enthält:

<Student> 
    <Name>XYZ</Name> 
    <Roll>15</Roll> 
    <Result /> 
    <Attendance>50</Attendance> 
</Student> 

Ich muss Fügen Sie das xml von @res in den Knoten Ergebnis in @student Variable mit XQuery.

Wie implementiert man das?

Bitte helfen.

+0

Eine "Hacky" String-Parsing-Lösung hinzugefügt, die auch für SQL Server 2005 funktionieren sollte - nicht schön, aber es sollte funktionieren. –

Antwort

31

In SQL Server 2008, es ist ziemlich einfach:

DECLARE @res XML = '<Subject>English</Subject> 
<Marks>67</Marks> 
<Subject>Science</Subject> 
<Marks>75</Marks>' 


DECLARE @student XML = '<Student> 
    <Name>XYZ</Name> 
    <Roll>15</Roll> 
    <Result /> 
    <Attendance>50</Attendance> 
</Student>' 


SET @student.modify('insert sql:variable("@res") as first into (/Student/Result)[1]') 

SELECT @student 

Das gibt mir die Ausgabe:

<Student> 
    <Name>XYZ</Name> 
    <Roll>15</Roll> 
    <Result> 
    <Subject>English</Subject> 
    <Marks>67</Marks> 
    <Subject>Science</Subject> 
    <Marks>75</Marks> 
    </Result> 
    <Attendance>50</Attendance> 
</Student> 

Leider ist die Fähigkeit .modify() zu rufen und eine sql:variable in der Insert-Anweisung zu verwenden, wurde eingeführt, nur mit SQL Server 2008 - funktioniert nicht in SQL Server 2005.

Ich sehe nicht, wie Sie dies in SQL Server 2005, o. tun könnten ther als zu hässlich String-Parsing und Ersatz zurückgreifen zurück: Sie können auch versuchen, um wieder auf relationale Daten und als zurück zu xml

SET @student = 
    CAST(REPLACE(CAST(@student AS VARCHAR(MAX)), 
       '<Result/>', 
       '<Result>' + CAST(@res AS VARCHAR(MAX)) + '</Result>') AS XML) 

Marc

0

; so etwas wie:

DECLARE @res xml = 
'<result> 
    <StudentID>1</StudentID> 
    <Subject>English</Subject> 
    <Marks>67</Marks> 
</result> 
<result> 
    <StudentID>1</StudentID> 
    <Subject>Science</Subject> 
    <Marks>75</Marks> 
</result>' 

DECLARE @student xml = 
'<Student> 
    <StudentID>1</StudentID> 
    <Name>XYZ</Name> 
    <Roll>15</Roll> 
    <Attendance>50</Attendance> 
</Student>' 

; 
WITH cte_1 
     AS (SELECT t.c.value('StudentID[1]', 'int') AS [StudentID] 
        ,t.c.value('Subject[1]', 'varchar(50)') AS [Subject] 
        ,t.c.value('Marks[1]', 'int') AS [Marks] 
      FROM @res.nodes('/result') AS t (c) 
      ), 
     cte_2 
     AS (SELECT t.c.value('StudentID[1]', 'int') AS [StudentID] 
        ,t.c.value('Name[1]', 'varchar(50)') AS [Name] 
        ,t.c.value('Roll[1]', 'int') AS [Roll] 
        ,t.c.value('Attendance[1]', 'int') AS [Attendance] 
      FROM @student.nodes('/Student') AS t (c) 
      ) 
    SELECT student.StudentID 
     ,student.[Name] 
     ,student.Roll 
     ,student.Attendance 
     ,(SELECT result.[Subject] 
        ,result.Marks 
      FROM cte_1 AS result 
      WHERE student.StudentID = result.StudentID 
      FOR 
      XML AUTO 
       ,TYPE 
       ,ELEMENTS 
     ) 
    FROM cte_2 AS student 
FOR  XML AUTO 
      ,ELEMENTS 

Returns:

<student> 
    <StudentID>1</StudentID> 
    <Name>XYZ</Name> 
    <Roll>15</Roll> 
    <Attendance>50</Attendance> 
    <result> 
    <Subject>English</Subject> 
    <Marks>67</Marks> 
    </result> 
    <result> 
    <Subject>Science</Subject> 
    <Marks>75</Marks> 
    </result> 
</student> 

Nicht gerade Ihr Beispiel, aber in der Nähe.

7

Dies wird in SQL 2005 arbeiten und ist meist eine XQuery-Lösung:

DECLARE @res xml 

SET @res = 
'<Subject>English</Subject> 
<Marks>67</Marks> 
<Subject>Science</Subject> 
<Marks>75</Marks>' 

DECLARE @student xml 
SET @student = 
'<Student> 
    <Name>XYZ</Name> 
    <Roll>15</Roll> 
    <Result /> 
    <Attendance>50</Attendance> 
</Student>' 

DECLARE @final XML 

SET @final = CAST(CAST(@student AS VARCHAR(MAX)) + '<test>' + CAST(@res AS VARCHAR(MAX)) + '</test>' AS XML) 

SET @final.modify('insert /test/* into (/Student/Result)[1]') 
SET @final.modify('delete /test') 

SELECT @final 

Sie Ihre @student Variable kann an diesem Punkt @final wenn Sie das tun müssen. Der Name "Test" für den Knoten war genau das, was ich gewählt habe. Sie können einen beliebigen Namen verwenden, solange er nicht bereits in Ihrem XML-Code erscheint.

Sie werfen im Grunde nur die zwei XML-Strings zusammen, so dass sie beide gleichzeitig zur Verfügung stehen.

Verwandte Themen