SQL Server вставка XML узел добавляет пространство имен - PullRequest
0 голосов
/ 02 мая 2018

У меня есть существующий столбец XML, к которому я хотел бы добавить узел, но узел добавляется с нежелательным пространством имен.

DECLARE @x XML =
'<Test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="abc">
  <Setting key="display" display="ABC" group="service" enabled="true">
    <Value xsi:type="xsd:string">ABC</Value>
  </Setting>
</Test>'

CREATE TABLE #C ( x XML )

INSERT INTO #C
SELECT @X

declare @name varchar(50) = 'ABC'
UPDATE #C
SET X.modify('insert <Setting key="about" display="About" group="service" enabled="true">
           <Value xsi:type="xsd:string">string of text about {sql:variable("@name")} here.</Value>
         </Setting> as last into (/Test[1])')

select * from #C

приводит к добавлению новой настройки как ...

<Setting key="about" display="About" group="service" enabled="true">
    <Value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:string">string of text about ABC here.</Value>
</Setting>

но я действительно хочу

    <Setting key="about" display="About" group="service" enabled="true">
        <Value xsi:type="xsd:string">string of text about ABC here.</Value>
    </Setting>

1 Ответ

0 голосов
/ 03 мая 2018

То, как XML-движок SQL-Server работает с пространствами имен, - в некоторых случаях - довольно раздражает ... Важно сказать, что вышеприведенное не является неправильным ... Повторять объявление пространства имен вполне нормально, но это вздутие живота в результате людям трудно читать и понимать XML, и он может потерпеть неудачу в (в) строгих валидаторах.

Причина в том, что такой XML всегда завершен. Вы можете разместить его где угодно в XML.

В вашем случае вы получите результат так, как вам хочется, заранее сообщив движку о пространстве имен:

неявное объявление

UPDATE #C
SET X.modify('declare namespace xsi="http://www.w3.org/2001/XMLSchema-instance";
              insert <Setting key="about" display="About" group="service" enabled="true">
                         <Value xsi:type="xsd:string">string of text about {sql:variable("@name")} here.</Value>
                     </Setting> 
              as last into (/Test[1])');

или WITH XMLNAMESPACES():

WITH XMLNAMESPACES('http://www.w3.org/2001/XMLSchema-instance' AS xsi)
UPDATE #C
SET X.modify('insert <Setting key="about" display="About" group="service" enabled="true">
                         <Value xsi:type="xsd:string">string of text about {sql:variable("@name")} here.</Value>
                     </Setting> 
              as last into (/Test[1])');
...