2

私は次のxmlドキュメントを持っています

<Root>
    <Translation>
        <Entry language ="ES"  text = "Alsace"/>
        <Entry language ="DE"  text = "Elsass"/>
        <Entry language ="EN" text = "Alsace"/>
    </Translation>
    <Translation>
        <Entry language ="ES"  text = "Brittany"/>
        <Entry language ="DE"  text = "Bretagne"/>
        <Entry language ="EN" text = "Brittany"/>
    </Translation>
</Root>

グループを保存しながら、テーブルに細かく刻む必要があります。したがって、translation要素にはid属性がないため、グループ化は構造内で暗黙的に行われます。

テーブルの結果は次のようになります。

translation_id, lanuage, text
---------------------------------
1,ES, Alsace 
1,DE,  Elsass 
1,EN, Alsace 
2,ES , Brittany 
2,DE, Bretagne 
2,EN Brittany

いろいろ試してみました

select newid(),
(   select rows.n.value('(@language)[1]', 'nvarchar(max)')
    from @p.nodes('/Translation/Entry') rows(n)
    )
from @p.nodes('/Translation') rows(n)

しかし、ある種のループを使用せずにグループ化IDを取得することはできないようです。

ありがとう

4

3 に答える 3

2

ループなし?わかった...

select 
    rn,
    t2.Entry.value('./@language','varchar(5)')  ,       
    t2.Entry.value('./@text','varchar(50)')         
    from
    (
        select 
            row_number() over (order by rows.n) as rn,
            rows.n.query('.') as trans  
            from @p.nodes('/Root/Translation') rows(n)
    ) trans     
        cross apply trans.nodes('Translation/Entry') as t2(Entry)
于 2012-07-25T13:47:11.053 に答える
0

最終的にはこのように解決しました。きれいではなく、ループなしでそれを行う方法があるに違いないと思います。

declare @p xml

set @p = 
'<Translation>
<Entry language ="ES"  text = "Alsace"/>
<Entry language ="DE"  text = "Elsass"/>
<Entry language ="EN"  text = "Alsace"/>
</Translation>
<Translation>
<Entry language ="ES"  text = "Aquitaine"/>
<Entry language ="DE"  text = "Aquitanien"/>
<Entry language ="EN"  text = "Aquitaine"/>
</Translation>
'

declare @trans table (id int identity, t xml, [guid] varchar(255))
declare @result table ([guid] varchar(255), language char(2), [text] nvarchar(max) )
declare @no int , @i int, @guid varchar(255), @t xml

insert @trans
(t, [guid])
select rows.n.query('.') as trans, newid() id
from @p.nodes('/Translation') rows(n)
set @no = scope_identity()
set @i =1

while @i <= @no
begin

select @guid = [guid],
@t = t
from @trans
where id = @i

insert @result
([guid], language, [text] )
select @guid, 
rows.n.value('(@language)[1]', 'nvarchar(max)'),
rows.n.value('(@text)[1]', 'nvarchar(max)')
from @t.nodes('/Translation/Entry') rows(n)

set @i = @i +1

end


select * from @result
于 2012-07-25T13:05:45.363 に答える
0

私はこのコードを書きます。あまり良い作品ではありませんが、機能しています。

        declare @p xml
    set @p = '<Root>
    <Translation>
    <Entry language ="ES"  text = "Alsace"/>
    <Entry language ="DE"  text = "Elsass"/>
    <Entry language ="EN" text = "Alsace"/>
    </Translation>
    <Translation>
    <Entry language ="ES"  text = "Brittany"/>
    <Entry language ="DE"  text = "Bretagne"/>
    <Entry language ="EN" text = "Brittany"/>
    </Translation>
    </Root>'

    Declare @n int
    set @n = 1  -- counter for transaction nodes in xml

    DECLARE @test xml -- to hold complete transaction node

    While @n <= 2 -- while loop starts
    BEGIN
    SET @test = ( select @p.query('/Root/Translation[sql:variable("@n")]') )

    SELECT
    @n as [Transaction],
    a.b.value('Entry[1]/@language','varchar(10)') AS [Language],
    a.b.value('Entry[1]/@text','varchar(10)') AS [Text]
    FROM @test.nodes('Translation') a(b)

    select @n as [Transaction] ,a.b.value('Entry[2]/@language','varchar(10)') AS [Language],
    a.b.value('Entry[2]/@text','varchar(10)') AS [Text]
    FROM @test.nodes('Translation') a(b)

    SELECT
    @n as [Transaction],
    a.b.value('Entry[3]/@language','varchar(10)') AS [Language],
    a.b.value('Entry[3]/@text','varchar(10)') AS [Text]
    FROM @test.nodes('Translation') a(b)


    SET @n = @n + 1  -- counter for transaction nodes in xml

    END  -- loop ended

Output:
    translation_id, lanuage, text
    ---------------------------------
    1,ES, Alsace 
    1,DE,  Elsass 
    1,EN, Alsace 
    2,ES , Brittany 
    2,DE, Bretagne 
    2,EN Brittany
于 2012-07-25T13:26:47.530 に答える