2011-07-01 30 views
3

我想添加一個屬性,如果它不存在。它應該很簡單,但我是XML XPath/XQuery /等的新手,所以請原諒我的無知。SQL Server XML添加屬性如果不存在

我希望能夠通過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> 
+2

你Xcused! :-p – LarsH

+0

SQL 2008 R2,如果有幫助的話 –

回答

3

你可以做

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