【问题标题】:Inserting new XML attribute using .modify() - how to make it last attribute?使用 .modify() 插入新的 XML 属性 - 如何使其成为最后一个属性?
【发布时间】:2018-06-15 22:22:23
【问题描述】:

我正在尝试更新 XML 列中的数据,并添加一个新属性(如果它尚不存在)。

这是我的脚本中最相关的部分:

UPDATE sp
set [PolicyXML].modify
    ('insert attribute source {sql:variable("@source")}
    into (/policies/policy[@type=sql:variable("@policyType")]/groups/group[@id=sql:variable("@groupId") and @accessPermissions=sql:variable("@accessPermissions") and @domainId=sql:variable("@domainId") and not (@source)])[1]
    ')
FROM #spTemp as sp

更改后,有问题的数据变为:

<policies xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <policy type="default">
    <groups>
      <group id="00000000-0000-0000-0000-000000000000" source="ZZ_MYNEWVALUE_ZZ" accessPermissions="31" domainId="00000000-0000-0000-0000-000000000000" />
    </groups>
  </policy>
</policies>

但我需要的是:

<policies xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <policy type="default">
    <groups>
      <group id="00000000-0000-0000-0000-000000000000" accessPermissions="31" domainId="00000000-0000-0000-0000-000000000000" source="ZZ_MYNEWVALUE_ZZ" />
    </groups>
  </policy>
</policies>

我似乎可以在互联网上找到的每篇文章都在谈论使用“as last into”而不是“into”,但这似乎是为了让节点成为最后一个节点,而不是让属性成为最后一个属性。这里没有效果。

有人知道如何让这个新属性排在最后吗?

【问题讨论】:

  • 根据this specification,属性的顺序不重要(而元素的顺序是)。即使您设法将属性放入给定的位置,下次打开它时,它也可能会出现在其他地方......
  • 这似乎是对的。我不确定如果我们使用模式定义是否仍然如此,但在这种情况下似乎也对 order 无动于衷。谢谢。

标签: sql-server xml tsql xpath


【解决方案1】:

我是通过insert 做出决定,然后是delete。

declare @spTemp table(PolicyXML xml);

declare @policyType nvarchar(max)='default',
        @source nvarchar(max)='ZZ_MYNEWVALUE_ZZ',
        @groupId nvarchar(max)='00000000-0000-0000-0000-000000000000',
        @accessPermissions nvarchar(max)='31',
        @domainId nvarchar(max)='00000000-0000-0000-0000-000000000000',
        @px xml='
<policies xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <policy type="default">
    <groups>
      <group id="00000000-0000-0000-0000-000000000000"
             accessPermissions="31"
             domainId="00000000-0000-0000-0000-000000000000" />
    </groups>
  </policy>
</policies>';

insert into @spTemp(PolicyXML) values(@px);

UPDATE @spTemp SET PolicyXML.modify('
insert (
for $g in /policies/policy[@type=sql:variable("@policyType")]/groups
          /group[@id=sql:variable("@groupId") and not (@source) and
                 @accessPermissions=sql:variable("@accessPermissions") and
                 @domainId=sql:variable("@domainId")]
  return
    <group>
      {$g/@*}
      {attribute source {sql:variable("@source")}}
    </group>
) after (/policies/policy[@type=sql:variable("@policyType")]/groups
         /group[@id=sql:variable("@groupId") and not (@source) and
                @accessPermissions=sql:variable("@accessPermissions") and
                @domainId=sql:variable("@domainId")])[1]')
OUTPUT INSERTED.PolicyXML as ins_px,DELETED.PolicyXML del_px
WHERE PolicyXML.exist('
/policies/policy[@type=sql:variable("@policyType")]/groups
/group[@id=sql:variable("@groupId") and not (@source) and
       @accessPermissions=sql:variable("@accessPermissions") and
       @domainId=sql:variable("@domainId")]')=1;

UPDATE @spTemp SET PolicyXML.modify('
delete /policies/policy[@type=sql:variable("@policyType")]/groups
       /group[@id=sql:variable("@groupId") and not (@source) and
              @accessPermissions=sql:variable("@accessPermissions") and
              @domainId=sql:variable("@domainId")]')
OUTPUT INSERTED.PolicyXML as ins_px,DELETED.PolicyXML del_px
WHERE PolicyXML.exist('
/policies/policy[@type=sql:variable("@policyType")]/groups
/group[@id=sql:variable("@groupId") and not (@source) and
       @accessPermissions=sql:variable("@accessPermissions") and
       @domainId=sql:variable("@domainId")]')=1;

【讨论】:

  • 这样就可以了。不幸的是,对于我的使用,这会减慢很多速度。我可能只会让属性排在第二位,然后通过这些步骤测试消耗它的任何东西都不会与订单有任何问题。不过答案很好。
猜你喜欢
  • 2019-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
  • 1970-01-01
  • 2017-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多