我正在尝试添加一个属性(如果它不存在)。它应该很简单,但我对 XML XPath/XQuery/等还不熟悉,所以请原谅我的无知。
我希望能够传递 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 中一次只能修改一个节点。
也许将上述内容与 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)