2011-02-03 73 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