3

xmlドキュメントの各セッションからすべての読み取りノードとその値を取得し、親ノードからセッションIDを取得したいと思います。これをSQLServer2008インスタンスで実行しています。

私のxml設定は次のとおりです。

<Sessions>
<SessionID>99</SessionID>
<Readings>
  <Reading>
    <Point>
      <Lat>-40.411558</Lat>
      <Lng>175.63504</Lng>
    </Point>
    <Heading>54</Heading>
    <Speed>0.1</Speed>
    <Height>0</Height>
    <FlowRate>0.69</FlowRate>
    <AppRate>74</AppRate>
  </Reading>
  ... more readings
</Readings>
<Sessions>

私の最初の試み(うまくいく)を以下に示しましたが、実行すると非常に遅いようです。ただし、SessionID、つまり../../SessionIDを追加する行を削除すると、パフォーマンスが大幅に向上するようです。12秒のクエリでわずか2秒になります。

        SELECT
            [SessionID] = c.value('(../../SessionID)[1]', 'int'),
            [Heading] = c.value('(Heading)[1]', 'float'),
            [Speed] = c.value('(Speed)[1]', 'float'),
            [Height] = c.value('(Height)[1]', 'float'),
            [FlowRate] = c.value('(FlowRate)[1]', 'float'),
            [AppRate] = c.value('(AppRate)[1]', 'float'),
            [Latitude] = c.value('(Point/Lat)[1]', 'float'),
            [Longtitude] = c.value('(Point/Lng)[1]', 'float')
        FROM
            @XMLData.nodes('/Sessions/Readings/Reading') XMLData(c)

とにかく、.. / ../表記を使用してSessionIDを参照する必要なしにこれを行うことができますか?このクエリはレコードを一時テーブルに挿入するために使用されているため、SessionIDが必要です。

insert into #MyTempTable
SELECT
            [SessionID] = c.value('(../../SessionID)[1]', 'int'),
            [Heading] = c.value('(Heading)[1]', 'float'),
            [Speed] = c.value('(Speed)[1]', 'float'),
            [Height] = c.value('(Height)[1]', 'float'),
            [FlowRate] = c.value('(FlowRate)[1]', 'float'),
            [AppRate] = c.value('(AppRate)[1]', 'float'),
            [Latitude] = c.value('(Point/Lat)[1]', 'float'),
            [Longtitude] = c.value('(Point/Lng)[1]', 'float')
        FROM
            @XMLData.nodes('/Sessions/Readings/Reading') XMLData(c)
4

1 に答える 1

4

../../を回避する最初の部分では、CROSSAPPLYを使用して両方のデータセットを提供できます。

また、より高速なINSERTが必要で、ロギングについて心配していない場合、SELECTINTOステートメントははるかに高速な挿入を提供します。

SELECT
    s.value('(SessionID)[1]', 'int') SessionID,             
    r.value('(Heading)[1]', 'float') Heading,
    r.value('(Speed)[1]', 'float') Speed,
    r.value('(Height)[1]', 'float') Height,
    r.value('(FlowRate)[1]', 'float') FlowRate,
    r.value('(AppRate)[1]', 'float') AppRate,
    r.value('(Point/Lat)[1]', 'float') Latitude,
    r.value('(Point/Lng)[1]', 'float') Longtitude
INTO #Reading
FROM
    @XMLData.nodes('/Sessions') as S(s)
    CROSS APPLY 
    s.nodes('./Readings/Reading') XMLData(r)
于 2012-05-10T03:21:08.333 に答える