一尘不染

SQL Server XML添加属性(如果不存在)

sql

我试图添加一个属性,如果它不存在。它应该很简单,但是我是XML XPath / XQuery / etc的新手,所以请原谅我的无知。

我希望能够传递XML数据并对其进行修改…

ALTER FUNCTION [dbo].[ConvertXmlData](@xmlData XML)
RETURNS XML
AS
BEGIN
  RETURN @xmlData.<something here>
END

如果我像这样传递数据:

<something> 
   this is sample data <xxx id="1"/> and <xxx id="2" runat="server" />. More <yyy id="3" />
</something>

我想要

<something>
this is sample data <xxx id="1" runat="server" /> and <xxx id="2" runat="server" />. More <yyy id="3" />

</something>

并不是 :

<something>
this is sample data <xxx id="1" runat="server" /> and <xxx id="2" runat="server" runat="server"/>. More <yyy id="3" />
</something>

阅读 199

收藏
2021-03-08

共1个答案

一尘不染

你可以做

SET @xmlData.modify('insert attribute runat { "server" } into descendant::xxx[not(@runat)][1]');

但是,这只会更改xxx不具有runat属性的第一个后代,至少对于SQL Server 2005,您一次只能修改一个节点。

也许将以上内容与WHILE结合使用,例如

WHILE @xmlData.exist('descendant::xxx[not(@runat)]') = 1
BEGIN
  SET @xmlData.modify('insert attribute runat { "server" } into descendant::xxx[not(@runat)][1]');
END

我没有访问SQL Server 2008 R2的权限,但我认为修改一次仍仅限于一个节点,因此您可以尝试

ALTER FUNCTION [dbo].[ConvertXmlData](@xmlData XML)
RETURNS XML
AS
BEGIN
    WHILE @xmlData.exist('descendant::xxx[not(@runat)]') = 1
    BEGIN
      SET @xmlData.modify('insert attribute runat { "server" } into descendant::xxx[not(@runat)][1]');
    END
  RETURN @xmlData
END
2021-03-08