Comment insert xml dans un noeud dans un autre xml en utilisant XQuery?

J'ai deux variables xml dites @res, @student dans un proc stocké dans SQL Server 2005.

@res contient

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

@student contient:

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

J'ai besoin d'insert le xml de @res dans le nœud. Résultat dans la variable @student en utilisant XQuery.

Comment mettre en œuvre cela?

S'il vous plaît aider.

Dans SQL Server 2008, c'est plutôt simple:

 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 

Cela me donne la sortie:

 <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> 

Malheureusement, la possibilité d'appeler .modify() et d'utiliser une sql:variable dans l'instruction insert a été introduite avec SQL Server 2008 uniquement – ne fonctionne pas dans SQL Server 2005.

Je ne vois pas comment vous pourriez faire cela dans SQL Server 2005, autre que le recours à l'parsing et au rlocation de string laide:

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

Marc

Cela fonctionnera dans SQL 2005 et est principalement une solution xquery:

 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 

Vous pouvez définir votre variable @student à @final à ce stade si vous avez besoin de le faire. Le nom de "test" pour le noeud était exactement ce que j'ai choisi d'utiliser. Vous pouvez utiliser n'importe quel nom tant qu'il n'apparaîtra pas déjà dans votre file XML .

Vous jetez simplement les deux strings XML set de sorte qu'elles soient toutes deux disponibles pour xquery à la fois.

Vous pouvez également essayer de revenir aux données relationnelles et de revenir à xml; quelque chose comme:

 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 tcvalue('StudentID[1]', 'int') AS [StudentID] ,tcvalue('Subject[1]', 'varchar(50)') AS [Subject] ,tcvalue('Marks[1]', 'int') AS [Marks] FROM @res.nodes('/result') AS t ( c ) ), cte_2 AS ( SELECT tcvalue('StudentID[1]', 'int') AS [StudentID] ,tcvalue('Name[1]', 'varchar(50)') AS [Name] ,tcvalue('Roll[1]', 'int') AS [Roll] ,tcvalue('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 

Résultats:

 <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> 

Pas exactement ton exemple, mais proche.