0

現在SQL Server 2005を使用しているGoogleベースのRSSフィードで使用するために、データを抽出しようとしています.

いくつか問題がありますが、解決できることを願っています!

  1. 名前空間
  2. グループ化

私の現在のSQLは次のとおりです。

SELECT [xml].query('
<Item xmlns:g="a">
<Title>{ data(*/*/*/Title) }</Title>
<g:id>{ sql:column("ReportingCode") }</g:id>
</Item>
')
FROM esh_xml 
where [Xml].value('(/*/*/*/Attributes/Attribute[@Description="Category"][text()="MasterMix"])[1]','nvarchar(2000)') is not null

現在のクエリの出力として、何千もの結果行を取得します

<item xmlns:g="a"><title>blah blah</title><g:id>asdasd<g:id></item>

私の望ましい出力は

<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:g="http://base.google.com/ns/1.0">
      <channel>
            <title>Mastermixdigital.com Product Feed </title>
            <link> http://www.mysite.com/ </link>
            <description>mastermix latest release feed </description>
            <item xmlns:g="a">
                  <title>blah blah</title>
                  <g:id>asdasd<g:id>
            </item>
            <item xmlns:g="a">
                  <title>blah blah</title>
                  <g:id>asdasd<g:id>
            </item>
            <item xmlns:g="a">
                  <title>blah blah</title>
                  <g:id>asdasd<g:id>
            </item>
      </channel>
</rss>

検索する前に冗長なノードを削除することで、クエリの実行を高速化できると私が信じているもう1つのことと、これについてのヒントがあれば教えてください。

どうもありがとう

4

1 に答える 1

1

私はあなたのxml構造やテーブルを持っていないので、あなたが何ができるかを示すサンプルを作成しました。

サンプルデータを設定します。各行のxmlに2つの項目がある2つの行、行1の1つの項目が、行2の1つの項目と重複しています。

declare @T table (ID int identity, [xml] xml)

insert into @T ([xml])
values ('
<root>
  <item>
    <id>1</id>
    <name>Name 1</name>
  </item>
  <item>
    <id>2</id>
    <name>Name 2</name>
  </item>
</root>
')

insert into @T ([xml])
values ('
<root>
  <item>
    <id>1</id>
    <name>Name 1</name>
  </item>
  <item>
    <id>3</id>
    <name>Name 3</name>
  </item>
</root>
')

すべての行からIDと名前を取得します

select  
  r.i.value('id[1]', 'int') as id,
  r.i.value('name[1]', 'varchar(10)') as name
from @T as T
  cross apply T.[xml].nodes('root/item') r(i)

結果、4行

id  name
1   Name 1
2   Name 2
1   Name 1
3   Name 3

重複を削除した同じクエリ

select distinct 
  r.i.value('id[1]', 'int') as id,
  r.i.value('name[1]', 'varchar(10)') as name
from @T as T
  cross apply T.[xml].nodes('root/item') r(i)  

結果3行

id  name
1   Name 1
2   Name 2
3   Name 3

xmlパス、ルートを使用して行をxmlに結合します

select distinct 
  r.i.value('id[1]', 'int') as id,
  r.i.value('name[1]', 'varchar(10)') as name
from @T as T
  cross apply T.[xml].nodes('root/item') r(i)  
for xml path('item'), root('root')

結果のxml

<root>
  <item>
    <id>1</id>
    <name>Name 1</name>
  </item>
  <item>
    <id>2</id>
    <name>Name 2</name>
  </item>
  <item>
    <id>3</id>
    <name>Name 3</name>
  </item>
</root>

名前空間付き

;with xmlnamespaces('a' as g)
select distinct 
  r.i.value('id[1]', 'int') as [g:id],
  r.i.value('name[1]', 'varchar(10)') as name
from @T as T
  cross apply T.[xml].nodes('root/item') r(i)  
for xml path('item'), root('root')

結果

<root xmlns:g="a">
  <item>
    <g:id>1</g:id>
    <name>Name 1</name>
  </item>
  <item>
    <g:id>2</g:id>
    <name>Name 2</name>
  </item>
  <item>
    <g:id>3</g:id>
    <name>Name 3</name>
  </item>
</root>
于 2011-02-03T13:52:42.657 に答える