2011-02-03 46 views
0

我試圖提取數據,在一個RSS提要谷歌基地使用當前使用SQL Server 2005分組結果在SQL Server 2005中使用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> 

另一件事我相信查詢的執行可以通過搜索之前通過刪除冗餘節點加快,並就如何我可能會去這任何提示!

非常感謝

+1

名稱空間和分組可以在純XQuery中完成。如果沒有輸入源,確切說明它是不可能的。數據庫表,列以及所有沒有標準SQL調用的XQuery引擎都將特定於SLQ Server未滿XQuery標準的抱怨。 – 2011-02-03 23:38:52

回答

1

我沒有你的XML結構或表,所以我創建了一個示例,演示你可以做什麼。

設置示例數據,每行兩行xml中有兩個項目,第一行中的一個項目與第二行中的一個項目重複。

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) 

結果,四排

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) 

結果三行

id name 
1 Name 1 
2 Name 2 
3 Name 3 

使用FOR 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

我們如何才能更進一步,將namspace僅添加到根輸出中?所以id可能會變成 – Treemonkey 2011-02-03 15:39:40