Mik*_*ike 5 t-sql xml-dml sql-server-2008
所以基本上我有一个脚本,根据这个节点是否存在更新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
Run Code Online (Sandbox Code Playgroud)
现在一切都按预期工作,只是插入的节点现在包含这样的空命名空间
<job xmlns="">
Run Code Online (Sandbox Code Playgroud)
如果我删除
;WITH XMLNAMESPACES(DEFAULT 'http://quartznet.sourceforge.net/JobSchedulingData')
Run Code Online (Sandbox Code Playgroud)
查询停止执行.我认为这是因为我的根节点定义了名称空间
<quartz xmlns="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" overwrite-existing-jobs="true">
Run Code Online (Sandbox Code Playgroud)
所以我的问题是 - 有没有办法阻止这个名称空间添加到正在插入的节点?
为了克服这个问题,我稍微改变了方法,特别是我在 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
Run Code Online (Sandbox Code Playgroud)
希望这对其他人有帮助。
| 归档时间: |
|
| 查看次数: |
824 次 |
| 最近记录: |