1

XMLからレコードを抽出し、それをSQLServerテーブルにロードするためのさらなる支援が必要です。

私はこれを私のものとして持っています@xml

<admin submitter_id="login0" effective_date="mm/dd/yyyy">
<rec effected_id="login1" adjustment="100.00" type="foo">
<reason reason_id="1" />
<reason reason_id="2" />
</rec>
<rec effected_id="login2" adjustment="50.00" type="bar">
<reason reason_id="3" />
</rec>
</admin>

結果セットからこれが必要です:

login0, login1, mm/dd/yyyy, 100.00, foo, 1
login0, login1, mm/dd/yyyy, 100.00, foo, 2
login0, login2, mm/dd/yyyy, 50.00, bar, 3

それは理にかなっていますか?reason_idの調整は1対多です。2行目を除くすべての値を抽出する方法を理解しました。最初のreason_idしか取得できず、次のレコードに進みます。これはCROSSAPPLYで打ち負かすことができると思いますが、動作させることができません。助けてください!

ああ、私も偽のXMLを受け取った可能性があります。それが間違っているなら、教えてください!

4

2 に答える 2

1

のようなものはどうですか

DECLARE @Xml XML

SELECT @Xml = '<admin submitter_id="login0" effective_date="mm/dd/yyyy"> 
<rec effected_id="login1" adjustment="100.00" type="foo"> 
<reason reason_id="1" /> 
<reason reason_id="2" /> 
</rec> 
<rec effected_id="login2" adjustment="50.00" type="bar"> 
<reason reason_id="3" /> 
</rec> 
</admin>'

SELECT  @Xml,
        A2.B.value('(../../@submitter_id)[1]','VARCHAR(50)'),
        A2.B.value('(../@effected_id)[1]','VARCHAR(50)'),
        A2.B.value('(../../@effective_date)[1]','VARCHAR(50)'),
        A2.B.value('(../@adjustment)[1]','FLOAT'),
        A2.B.value('(../@type)[1]','VARCHAR(50)'),
        A2.B.value('(@reason_id)[1]','INT')
FROM    @XML.nodes('//admin/rec/reason')  A2(B)

SQL フィドルのデモ

于 2012-10-08T05:00:11.233 に答える
0

次の T-SQL コード スニペットを使用してみてください。

SELECT
    Submitter = @xml.value('(/admin/@submitter_id)[1]', 'varchar(50)'),
    EffectedID = Rec.value('(@effected_id)[1]', 'varchar(50)'),
    DateStamp = @xml.value('(/admin/@effective_date)[1]', 'varchar(50)'),
    TypeID = Rec.value('(@type)[1]', 'varchar(50)'),
    ReasonID = Reason.value('(@reason_id)[1]', 'int')
FROM
    @xml.nodes('/admin/rec') AS Tbl(Rec)
CROSS APPLY
    Rec.nodes('reason') AS T2(Reason)

次の出力が得られます。

ここに画像の説明を入力

ノードのネストされた 2 つのリストが必要です。最初のリストは<rec>inside からすべてのノードを取得し、2 番目のリストは各ノード内<admin>のすべてのノードを反復処理します。そうすれば、各レベルにサブノードがいくつあっても、ネストされた 2 つのレベルのサブノードからすべての情報を確実に抽出できます。<reason><rec>

于 2012-10-08T04:58:28.300 に答える