3

属性が存在しない場合は、属性を追加しようとしています。単純なはずですが、私は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>
4

1 に答える 1

3

できるよ

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

ただし、これにより変更されるのはxxx、runat属性を持たない最初の子孫のみです。少なくともSQL Server 2005では、一度に1つのノードしか変更できません。

たぶん、上記を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にアクセスできませんが、変更は一度に1つのノードに制限されているので、試してみることができます。

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
于 2011-07-01T16:15:07.450 に答える