Обновить значение XML с несколькими пространствами имен не работает - PullRequest
1 голос
/ 03 октября 2019

Я искал много вопросов для этого, но я не могу найти то, что мне не хватает, у меня есть следующий xml, и я хочу обновить SubmissionFormId

enter image description here

Я использую следующий скрипт, но я не могу понять, почему он не работает.

WITH XMLNAMESPACES('http://www.w3.org/2001/XMLSchema-instance' AS i,'http://schemas.ersl.ie/regsys' AS xs)
update submission_form_schema
SET sub_form_xml.modify('  
  replace value of (/SubmissionForm/SubmissionFormId/text())[1]  
  with ("11519")')
where sub_form_id = 11519
select top 10* from submission_form_schema where sub_form_id = 11519

Моя таблица выглядит так

enter image description here

Любые подсказки или намеки на то, что я должен искать, очень помогли бы.

Ответы [ 2 ]

1 голос
/ 06 октября 2019

Невозможно увидеть весь xml, но очевидная проблема заключается в том, что вы не указываете определенные префиксы в выражении replace value of. Это должно быть

WITH XMLNAMESPACES('http://www.w3.org/2001/XMLSchema-instance' AS i,'http://schemas.ersl.ie/regsys' AS xs)
update submission_form_schema
SET sub_form_xml.modify('  
  replace value of (/xs:SubmissionForm/xs:SubmissionFormId/text())[1]  
  with ("11519")')
where sub_form_id = 11519;

Демо:

create table submission_form_schema(
  sub_form_id int,
  sub_form_xml xml
);
insert submission_form_schema values
(11519, '<SubmissionForm xmlns="http://schemas.ersl.ie/regsys" xmlns:i="http://schemas.ersl.ie/regsys">
       <SubmissionFormId>22222</SubmissionFormId>
     </SubmissionForm>');

WITH XMLNAMESPACES('http://www.w3.org/2001/XMLSchema-instance' AS i,'http://schemas.ersl.ie/regsys' AS xs)
update submission_form_schema
SET sub_form_xml.modify('  
  replace value of (/xs:SubmissionForm/xs:SubmissionFormId/text())[1]  
  with ("11519")')
where sub_form_id = 11519;

select *
from submission_form_schema;

Возвращает

sub_form_id sub_form_xml
------  --------
11519   <SubmissionForm xmlns="http://schemas.ersl.ie/regsys" xmlns:i="http://schemas.ersl.ie/regsys"><SubmissionFormId>11519</SubmissionFormId></SubmissionForm>
1 голос
/ 06 октября 2019

Вы можете использовать определенные xs::

WITH XMLNAMESPACES('http://www.w3.org/2001/XMLSchema-instance' AS i
                  ,'http://schemas.ersl.ie/regsys' AS xs)
update submission_form_schema
SET sub_form_xml.modify('  
  replace value of (/xs:SubmissionForm/xs:SubmissionFormId/text())[1]  
  with ("11519")')
where sub_form_id = 11519;

db <> fiddle demo


Альтернативно, используя DEFAULT:

WITH XMLNAMESPACES('http://www.w3.org/2001/XMLSchema-instance' AS i
                  ,DEFAULT 'http://schemas.ersl.ie/regsys')
update submission_form_schema
SET sub_form_xml.modify('  
  replace value of (/SubmissionForm/SubmissionFormId/text())[1]  
  with ("11519")')
where sub_form_id = 11519;

db <> fiddle demo2


Или даже пропустите XMLNAMESPACES и используйте подстановочный знак:

update submission_form_schema
SET sub_form_xml.modify('  
  replace value of (/*:SubmissionForm/*:SubmissionFormId/text())[1]  
  with ("11519")')
where sub_form_id = 11519;

db <> fiddle demo3

...