2016-10-25 5 views
1

У меня эти два XML, которые хранятся в 2 таблицах.Изменение столбца XML с использованием MS SQL

Вопрос XML

<Question> 
    <Choice ID="1"> 
     <Value>Choice A</Value> 
    </Choice> 
    <Choice ID="2"> 
     <Value>Choice B</Value> 
    </Choice> 
    <Choice ID="3"> 
     <Value>Choice C</Value> 
    </Choice> 
    <Choice ID="4"> 
     <Value>Choice D</Value> 
    </Choice> 
    <Choice ID="5"> 
     <Value>Choice E</Value> 
    </Choice> 
</Question> 

XML-ответ

<Response> 
    <Question> 
     <Value>Choice B</Value> 
     <Value>Choice C</Value> 
    </Question> 
</Response> 

Мне нужно добавить новый атрибут называется ID, всем Значение элементов, присутствующих в Ответ e XML. Значение нового ID атрибут можно найти в Вопрос XML.

Например, если вы видите вопрос XML, правильный ID значения Choice B is 2 и Choice C is 3

Таким образом, окончательный XML Ответ, который мне нужно, должно быть, как это

<Response> 
    <Question> 
     <Value ID="2">Choice B</Value> 
     <Value ID="3">Choice C</Value> 
    </Question> 
</Response> 

Может кто-нибудь, пожалуйста, скажите мне, как это сделать?

+0

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

+0

@LordWilmore Спасибо за ваше предложение. Я изменил код, который генерирует ответ, поэтому новые ответы будут иметь атрибут ID. но есть ответы, которые уже сгенерированы до изменения, не будут иметь атрибута. Поэтому для этого мне нужно написать сценарий обновления, –

ответ

2

Если вы хотите изменить более одного места в XML в большинстве случаев лучше всего shredd информацию и повторно построить XML с нуля:

DECLARE @q XML= 
N'<Question> 
    <Choice ID="1"> 
     <Value>Choice A</Value> 
    </Choice> 
    <Choice ID="2"> 
     <Value>Choice B</Value> 
    </Choice> 
    <Choice ID="3"> 
     <Value>Choice C</Value> 
    </Choice> 
    <Choice ID="4"> 
     <Value>Choice D</Value> 
    </Choice> 
    <Choice ID="5"> 
     <Value>Choice E</Value> 
    </Choice> 
</Question>'; 

DECLARE @r XML= 
N'<Response> 
    <Question> 
     <Value>Choice B</Value> 
     <Value>Choice C</Value> 
    </Question> 
</Response>'; 

WITH QuestionCTE AS 
(
    SELECT c.value('@ID','int') AS qID 
      ,c.value('Value[1]','nvarchar(max)') AS qVal 
    FROM @q.nodes('Question/Choice') AS A(c) 
) 
,ResponseCTE AS 
(
    SELECT r.value('.','nvarchar(max)') AS rVal 
    FROM @r.nodes('Response/Question/Value') AS A(r) 
) 
SELECT 
(
    SELECT q.qID AS [Value/@ID] 
      ,q.qVal AS [Value] 
    FROM ResponseCTE AS r 
    LEFT JOIN QuestionCTE AS q ON r.rVal=q.qVal 
    FOR XML PATH(''),TYPE 
) 
FOR XML PATH('Question'),ROOT('Response') 
1

Вы можете преобразовать XML в таблицы (вопрос & ответ), а затем ссылку на значение. Затем вы смотрите идентификатор из таблицы вопросов. Пример:


DECLARE @xml_q XML = N' 
<Question> 
    <Choice ID="1"> 
     <Value>Choice A</Value> 
    </Choice> 
    <Choice ID="2"> 
     <Value>Choice B</Value> 
    </Choice> 
    <Choice ID="3"> 
     <Value>Choice C</Value> 
    </Choice> 
    <Choice ID="4"> 
     <Value>Choice D</Value> 
    </Choice> 
    <Choice ID="5"> 
     <Value>Choice E</Value> 
    </Choice> 
</Question>'; 

DECLARE @xml_r XML = N' 
<Response> 
    <Question> 
     <Value>Choice B</Value> 
     <Value>Choice C</Value> 
    </Question> 
</Response>'; 

;WITH q_id AS (
    SELECT 
     n.c.value('(./Value)[1]','NVARCHAR(128)') AS value, 
     n.c.value('@ID','INT') AS id 
    FROM 
     @xml_q.nodes('//Choice') AS n(c) 
), 
r_v AS (
    SELECT 
     n.c.value('(.)[1]','NVARCHAR(128)') AS value 
    FROM 
     @xml_r.nodes('//Value') AS n(c) 
) 
SELECT 
    (
     SELECT 
      q_id.id AS "Value/@ID", 
      r_v.value AS "Value" 
     FROM 
      r_v 
      INNER JOIN q_id ON 
       q_id.value=r_v.value 
     FOR 
      XML PATH(''), TYPE 
    ) 
FOR 
    XML PATH('Question'), ROOT('Response'); 

Даст ответ:

<Response> 
    <Question> 
    <Value ID="2">Choice B</Value> 
    <Value ID="3">Choice C</Value> 
    </Question> 
</Response> 

 Смежные вопросы

  • Нет связанных вопросов^_^