1

私はXMLを持っています

  <applicationbuilds xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://analysiscenter.veracode.com/schema/2.0/applicationbuilds" xsi:schemaLocation="https://analysiscenter.veracode.com/schema/2.0/applicationbuilds https://analysiscenter.veracode.com/resource/2.0/applicationbuilds.xsd" >
<application app_name="Architecture" app_id="15439">
<build   version="V 2.0" build_id="16158">

</build>
</application>
</applicationbuilds>

以下のクエリを使用して、xml から appid、build_id、および version を選択します。

;WITH XMLNAMESPACES(DEFAULT 'https://analysiscenter.veracode.com/schema/2.0/applicationbuilds')
SELECT 

   Y.ID.value('../@app_id', 'varchar(max)') as app_id,
  Y.ID.value('@build_id', 'varchar(max)') as build_id,
   Y.ID.value('@version', 'varchar(max)') as build_name

FROM @XML.nodes('//applicationbuilds/application/build') as Y(ID)

正常に動作しますが、クエリが結果セットを返すのに非常に長い時間がかかります。ラインを避けるだけなら

 Y.ID.value('../@app_id', 'varchar(max)') as app_id,

クエリの実行には 1 秒もかかりません。そのため、上記のコード行が遅延を引き起こしています。それほど遅延を引き起こさずに app_id をフェッチする最良の方法は何ですか?

SQLフィドルリンク:http://sqlfiddle.com/#!3/d41d8/19883 ありがとう

4

1 に答える 1

2

「アプリケーション」要素と「ビルド」要素がいくつあるかによって異なります。

'application' 要素と 'build' 要素は 1 つだけです。

;WITH XMLNAMESPACES(DEFAULT 'https://analysiscenter.veracode.com/schema/2.0/applicationbuilds')
SELECT
    Y.ID.value('@app_id', 'varchar(max)') as app_id,
    Y.ID.value('(build/@build_id)[1]', 'varchar(max)') as build_id,
    Y.ID.value('(build/@version)[1]', 'varchar(max)') as build_name
FROM @XML.nodes('(/applicationbuilds/application)[1]') as Y(ID)

多くの「アプリケーション」および「ビルド」要素:

;WITH XMLNAMESPACES(DEFAULT 'https://analysiscenter.veracode.com/schema/2.0/applicationbuilds')
SELECT
    Y.ID.value('@app_id', 'varchar(max)') as app_id,
    Z.Z.value('@build_id', 'varchar(max)') as build_id,
    Z.Z.value('@version', 'varchar(max)') as build_name
FROM @XML.nodes('/applicationbuilds/application') as Y(ID)
CROSS APPLY Y.ID.nodes('build')Z(Z)
于 2013-09-02T09:59:24.963 に答える