如何防止XML-DML修改函数向插入节点添加空名称空间

时间:2013-10-29 15:29:20

标签: sql-server-2008 tsql 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">

所以我的问题是 - 有没有办法阻止这个名称空间添加到正在插入的节点?

1 个答案:

答案 0 :(得分:4)

为了克服这个问题,我稍微改变了方法,特别是我在xml-dml修改函数本身中声明了xml名称空间,并在插入节点中添加了名称空间前缀。这就是诀窍

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

希望这有助于其他人。

相关问题