Как предотвратить функцию изменения XML-DML, добавляющую пустые пространства имен к узлам вставки

Итак, в основном у меня есть скрипт, который обновляет XML в зависимости от того, существует ли такой узел или нет. Вот t-sql

DECLARE @newJob XML
SET @newJob = N'<job>
    <job-detail>
      <name>job-name</name>
    </job-detail>
  </job>'

;WITH XMLNAMESPACES(DEFAULT 'http://quartznet.sourceforge.net/JobSchedulingData')
UPDATE XmlTable
SET ConfigXml.modify('
insert sql:variable("@newJob") 
as last into (/quartz)[1]')
WHERE ConfigXml.exist(N'//quartz/job/job-detail/name[.="job-name"]') = 0

Теперь все работает так, как ожидалось, за исключением того, что только вставленный узел теперь содержит пустое пространство имен, подобное этому.

<job xmlns="">

если я удалю

;WITH XMLNAMESPACES(DEFAULT 'http://quartznet.sourceforge.net/JobSchedulingData')

запрос перестает выполняться. Я думаю, это потому, что в моем корневом узле определены пространства имен.

<quartz xmlns="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" overwrite-existing-jobs="true">

Итак, мой вопрос: есть ли способ предотвратить добавление этого пространства имен к вставляемому узлу?


person Mike    schedule 29.10.2013    source источник


Ответы (1)


Чтобы преодолеть эту проблему, я немного изменил подход, в частности, я объявляю пространства имен xml в самой функции модификации xml-dml и добавляю префиксы пространств имен к вставляемым узлам. Это помогло

UPDATE XmlTable
SET ConfigXml.modify('
declare namespace ns="http://quartznet.sourceforge.net/JobSchedulingData";
insert <ns:job>
    <ns:job-detail>
      <ns:name>jobName</ns:name>
    </ns:job-detail>
  </ns:job>
as last into (/ns:quartz)[1]')
WHERE ConfigXml.exist(N'
declare namespace ns="http://quartznet.sourceforge.net/JobSchedulingData";
//ns:quartz/ns:job/ns:job-detail/ns:name[.="jobName"]') = 0

Надеюсь, это поможет кому-то другому.

person Mike    schedule 30.10.2013