Как вставить xml в узел в другом xml, использующем XQuery?

Как упомянуто там существуют многие сервисы, если Вы надеетесь действительно проверять весь адрес тогда, я настоятельно рекомендую движение с сервисом типа веб-сервиса гарантировать, что изменения могут быстро быть распознаны Вашим приложением.

В дополнение к сервисам упомянул выше, webservice.net имеет этот американский сервис Проверки Адреса. http://www.webservicex.net/WCF/ServiceDetails.aspx?SID=24

6
задан marc_s 11 December 2009 в 19:23
поделиться

3 ответа

Вы также можете попробовать вернуться к реляционным данным, а затем обратно к xml; что-то вроде:

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

Возвращает:

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

Не совсем ваш пример, но близко.

0
ответ дан 8 December 2019 в 02:24
поделиться

В SQL Server 2008 это довольно просто:

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

Это дает мне результат:

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

К сожалению, возможность вызвать .modify () и использовать sql: переменная в операторе вставки была введена только в SQL Server 2008 - не работает в SQL Server 2005.

Я не понимаю, как вы могли бы сделать это в SQL Server 2005, кроме возвращаясь к некрасивому синтаксическому анализу и замене строк:

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

Marc

32
ответ дан 8 December 2019 в 02:24
поделиться

Это будет работать в SQL 2005 и в основном является решением 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

Вы можете установить для своей переменной @student значение @final на этом этапе, если вам нужно это сделать. Название «тест» для узла было именно тем, что я выбрал. Вы можете использовать любое имя до тех пор, пока оно еще не появится в вашем XML .

Вы просто объединяете две строки XML вместе, чтобы они обе были доступны для xquery одновременно.

6
ответ дан 8 December 2019 в 02:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: