我试图添加一个属性,如果它不存在。它应该很简单,但是我是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>
你可以做
SET @xmlData.modify('insert attribute runat { "server" } into descendant::xxx[not(@runat)][1]');
但是,这只会更改xxx不具有runat属性的第一个后代,至少对于SQL Server 2005,您一次只能修改一个节点。
xxx
也许将以上内容与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