0

私は次のものを持っています:

declare @xml XML

SET @xml = '<record priref="2" creation="2009-12-14T10:39:04">
      <field tag="aa" occ="1" lang="nl-NL">somedata</field>
      <field tag="bb" occ="1" lang="en-US">somedata</field>
      <field tag="bb" occ="2" lang="en-US">somedata</field>
      <field tag="cc" occ="1">testdata</field>
      <field tag="dd" occ="1">testdata</field>
      <field tag="ee" occ="1" lang="nl-NL">somedata</field>
      <field tag="ee" occ="1" lang="en-US">somedata</field>
    </record>' 

DECLARE @nodeCount int
DECLARE @i int

SET @i = 1

SELECT @nodeCount = @xml.value('count(/record/field/@lang)','varchar(5)') 

WHILE (@i <= @nodeCount)
BEGIN
Set @xml.modify('replace value of (/record/field/@lang)[.="en-US"][1] with "nl-NL"')

SET @i = @i + 1
END

SELECT @xml

属性@langを条件付きで更新したいと思います。

'tag'と'occ'に同じ属性値の組み合わせを持つノードがある場合(tag = eeなど)、@langの属性値は変更されないままである必要があります。

その他の場合は、上記のクエリがすでに実行しているように変更する必要があります。「en-US」を「nl-NL」に変更します。

誰かがこれを行う方法を知っていますか?前もって感謝します!

4

1 に答える 1

0

これはそれを行う必要があります

DECLARE @xml XML;

SET @xml = '<record priref="2" creation="2009-12-14T10:39:04">
      <field tag="aa" occ="1" lang="nl-NL">somedata</field>
      <field tag="bb" occ="1" lang="en-US">somedata</field>
      <field tag="dd" occ="1">testdata</field>
      <field tag="bb" occ="2" lang="en-US">somedata</field>
      <field tag="cc" occ="1">testdata</field>
      <field tag="ee" occ="1" lang="nl-NL">somedata</field>
      <field tag="ee" occ="1" lang="en-US">somedata</field>
    </record>' 

DECLARE @no INT;
DECLARE @updneeded INT;
DECLARE nodecur CURSOR LOCAL FAST_FORWARD
FOR
  SELECT  rn,
          CASE WHEN COUNT(1) OVER ( PARTITION BY tag, occ ) > 1 THEN 0
               ELSE 1
          END updneeded
  FROM    ( SELECT  ROW_NUMBER() OVER ( ORDER BY node ) AS rn,
                    node.value('@tag', 'NVARCHAR(MAX)') AS tag,
                    node.value('@occ', 'NVARCHAR(MAX)') AS occ
            FROM    @xml.nodes('/record/field') x ( node )
          ) X;
OPEN nodecur;
WHILE ( 1 = 1 ) 
  BEGIN
    FETCH NEXT FROM nodecur INTO @no, @updneeded;
    IF ( @@FETCH_STATUS <> 0 ) BREAK;

    IF ( @updneeded = 1 ) 
      SET @xml.modify('replace value of (/record/field[sql:variable("@no")]/@lang)[.="en-US"][1] with "nl-NL"');
  END
CLOSE nodecur;
DEALLOCATE nodecur;

SELECT  @xml;

ただし、SQLは、これらのタイプの操作ではそれほど高速ではありません。アプリコードでこれを行うか、CLR関数を組み合わせるとより効果的かもしれません。

于 2012-10-18T00:23:38.043 に答える