2011-02-03 4 views
0

Я пытаюсь извлечь данные, использовать в корм RSS для Google Base в настоящее время с помощью 2005.результаты группирование в SQL Server 2005 с помощью XQuery

Там несколько проблем, которые есть, которые я надеюсь, может быть решена SQL Server !

  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-сервера, который не является полным стандартом XQuery. –

ответ

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

Получить идентификатор и имя из всех строк

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 

Регистрация строки обратно в 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 в ваш XML-выход только на корневой каталог?поэтому id мог бы стать – Treemonkey

+1

Добавленный запрос пространства имен –

Смежные вопросы