Sql server 使用.modify()插入新的XML属性-如何使其成为最后一个属性?
我试图更新XML列中的数据,如果它不存在,则添加一个新属性 以下是我脚本中最相关的部分:Sql server 使用.modify()插入新的XML属性-如何使其成为最后一个属性?,sql-server,xml,tsql,xpath,Sql Server,Xml,Tsql,Xpath,我试图更新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 @accessP
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”,但这似乎是为了让一个节点成为最后一个节点,而不是让一个属性成为最后一个属性。在这里没有效果
有人知道如何使这个新属性排在最后吗?我决定先插入
然后删除
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;
declare@spTemp表(PolicyXML);
声明@policyType nvarchar(max)=“默认值”,
@source nvarchar(最大值)='ZZ_MYNEWVALUE_ZZ',
@groupId nvarchar(max)='00000000-0000-0000-0000-000000000000',
@访问权限nvarchar(最大值)='31',
@域名nvarchar(最大值)='00000000-0000-0000-0000-000000000000',
@pxxml文件
';
插入@spTemp(PolicyXML)值(@px);
更新@spTemp SET PolicyXML.modify('
插入(
对于/policies/policy[@type=sql:variable(@policyType”)]/groups中的$g
/组[@id=sql:variable(@groupId”)和非(@source)和
@accessPermissions=sql:变量(“@accessPermissions”)和
@domainId=sql:variable(“@domainId”)]
返回
{$g/@*}
{属性源{sql:variable(@source”)}
)在(/policies/policy[@type=sql:variable(@policyType”)]/groups之后
/组[@id=sql:variable(@groupId”)和非(@source)和
@accessPermissions=sql:变量(“@accessPermissions”)和
@domainId=sql:variable(“@domainId”))[1])
将INSERTED.PolicyXML输出为ins_px,DELETED.PolicyXML del_px
其中PolicyXML.exist('
/策略/策略[@type=sql:variable(@policyType”)]/groups
/组[@id=sql:variable(@groupId”)和非(@source)和
@accessPermissions=sql:变量(“@accessPermissions”)和
@domainId=sql:variable(“@domainId”)]')=1;
更新@spTemp SET PolicyXML.modify('
删除/policies/policy[@type=sql:variable(@policyType”)]/groups
/组[@id=sql:variable(@groupId”)和非(@source)和
@accessPermissions=sql:变量(“@accessPermissions”)和
@domainId=sql:variable(“@domainId”)]')
将INSERTED.PolicyXML输出为ins_px,DELETED.PolicyXML del_px
其中PolicyXML.exist('
/策略/策略[@type=sql:variable(@policyType”)]/groups
/组[@id=sql:variable(@groupId”)和非(@source)和
@accessPermissions=sql:变量(“@accessPermissions”)和
@domainId=sql:variable(“@domainId”)]')=1;
根据属性的顺序不重要(而元素的顺序是)。即使您成功地将属性放入给定的位置,下次打开它时,它可能会出现在其他地方…这似乎是正确的。我不确定如果我们使用模式定义,它是否仍然是真的,但在这种情况下,它似乎也与顺序无关。谢谢。那就行了。不幸的是,对于我来说,这会让事情慢下来很多。我可能会让属性排在第二位,然后通过这些步骤来测试使用它的任何东西在顺序上都没有任何问题。回答得不错。