2011-07-01 13 views
3

属性が存在しない場合は追加しようとしています。単純なはずですが、私はXML XPath/XQuery/etcの新機能ですので、私の無知を許してください。 属性が存在しない場合、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

試みることができるので、修正はまだ一度に1つのノードに限定されていると思います! :-p – LarsH

+0

SQL 2008 R2、fyi、それが役立つ場合 –

答えて

3

あなたは

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

を行うことができますしかし、これは唯一、少なくともSQL Server 2005にだけ一度に1つのノードを変更することができ、ラナ属性を持っていない最初の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へのアクセス権を持っていないが、私はあなたがあなたがXcusedさ

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 
関連する問題