sql >> データベース >  >> RDS >> Sqlserver

SQL 変数を使用して XML ノードを繰り返す方法

    あなた自身のコードは、もう 1 つの [1] だけで機能します .関数 .modify() [sql:variable(...)] を解釈できません ... これは、複数の結果を持つフィルタであっても、任意のフィルタである可能性があります... したがって、これを次のように変更してください:

    DECLARE @xml xml = '<Root>
                          <Contacts>
                            <Contact name="John Doe" type="REG" other="value" />
                            <Contact name="Jane Doe" type="REG" other="value" />
                            <Contact name="Jennifer Doe" type="REG" other="value" />
                            <Contact name="Jane Doe" type="REG" other="value" />
                          </Contacts>
                        </Root>';
    DECLARE @i int = 1
    SET @xml.modify('replace value of (/Root/Contacts/Contact)[sql:variable("@i")][1]/@type with "NEW"')
    SELECT @xml
    

    しかし、私は別の道に進みます... 派生テーブルとしてすべてを読み取り、次のように XML を再構築することができます:

    SELECT
    (
        SELECT c.value('@name','nvarchar(max)') AS [@name]
              --,c.value('@type','nvarchar(max)') AS [@type]
              ,'NEW' AS [@type]
              ,c.value('@other','nvarchar(max)') AS [@other]
        FROM @xml.nodes('/Root/Contacts/Contact') AS A(c)
        FOR XML PATH('Contact'),ROOT('Contact'),TYPE
    )
    FOR XML PATH('Root')
    

    もう 1 つのアプローチは FLWOR です。

    SELECT @xml.query('
    for $r in /Root/Contacts
        return <Root><Contacts>
        {
            for $c in /Root/Contacts/Contact
               return <Contact name="{$c/@name}" type="NEW" other="{$c/@other}"/>
        }
        </Contacts></Root>
    ')
    



    1. IDの文字列を返すサブクエリを使用してWHEREIDINを実行します

    2. データベースから同様の経度と緯度を取得する

    3. 可変アリティを備えたEctoクエリとカスタムMySQL関数

    4. Oracle SQL-REGEXP_LIKEには、a-zまたはA-Z以外の文字が含まれています