2011-02-03 5 views
0

を使用して!グループ化した結果、私はGoogleのベースのRSSフィードで使用するために、データを抽出しようとしていたXQuery

  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> 

私は、クエリの実行が通じ検索する前に、冗長ノードを削除することで高速化することができ信じているもう一つ、私はこのことについて行くかもしれない方法上の任意のヒントになります!私はあなたのXML構造やテーブルを持っていないので、私はあなたが何ができるかを示すサンプルを作成した

感謝

+1

名前空間とグループ化は、純粋なXQueryで行うことができます。入力ソースがないと正確にどのように伝えるのかわかりません。データベーステーブル、カラム、およびXQueryエンジンの標準的でないSQL呼び出しはすべて、SLQサーバに固有のものであり、完全なXQuery標準ではありません。 –

答えて

1

サンプルデータをセットアップします。各行にxmlの2つの項目があり、1つの項目の1つの項目が2つ目の項目と重複しています。

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> 
') 

重複を持つすべての行

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 

同じクエリからのIDと名前を取得します

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行

01を削除
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> 
+0

私たちはさらに一歩進んで、xml出力にnamspaceをルートにのみ適用できますか?IDはになる可能性があります。 Treemonkey

+1

名前空間クエリーが追加されました –