Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 сортировка данных XML  [new]
A-LeXus
Member

Откуда: Latvia, Jurmala
Сообщений: 63
Помогите,
как правльно написать сортировку для XML, который достаю из базы.

к примеру:
<Data>
  <Record>
    <RowNumber>2</RowNumber>
<EventId>1</EventId>
<ActivityId>00000000-0000-0000-0000-000000000000</ActivityId>
  </Record>
  <Record>
    <RowNumber>1</RowNumber>
<EventId>1</EventId>
<ActivityId>00000000-0000-0000-0000-000000000000</ActivityId>
  </Record>
  <Record>
    <RowNumber>3</RowNumber>
<EventId>1</EventId>
<ActivityId>00000000-0000-0000-0000-000000000000</ActivityId>
  </Record>
</Data>

выдать отсортированый по RowNumber:
<Data>
 
  <Record>
    <RowNumber>1</RowNumber>
<EventId>1</EventId>
<ActivityId>00000000-0000-0000-0000-000000000000</ActivityId>
  </Record>
 <Record>
    <RowNumber>2</RowNumber>
<EventId>1</EventId>
<ActivityId>00000000-0000-0000-0000-000000000000</ActivityId>
  </Record>
  <Record>
    <RowNumber>3</RowNumber>
<EventId>1</EventId>
<ActivityId>00000000-0000-0000-0000-000000000000</ActivityId>
  </Record>
</Data>
9 июл 12, 13:09    [12838295]     Ответить | Цитировать Сообщить модератору
 Re: сортировка данных XML  [new]
Glory
Member

Откуда:
Сообщений: 104760
Использовать ORDER BY в запросе, который формирует ваш XML
9 июл 12, 13:21    [12838359]     Ответить | Цитировать Сообщить модератору
 Re: сортировка данных XML  [new]
A-LeXus
Member

Откуда: Latvia, Jurmala
Сообщений: 63
Glory,
боусь там не получиться
(SELECT cast ('<'+LTRIM(RTRIM(KeyName))>' +'<![CDATA['+LTRIM(RTRIM(AuditDataValues.Value)) +']]>'+ '</'+LTRIM(RTRIM(AuditDataKeys.KeyName))+'>' as xml) AS 'node()'
FROM ...
9 июл 12, 13:30    [12838410]     Ответить | Цитировать Сообщить модератору
 Re: сортировка данных XML  [new]
Glory
Member

Откуда:
Сообщений: 104760
A-LeXus
боусь там не получиться

Как вы тогда предлагате указать серверу, что что-то надо упорядочивать ?
9 июл 12, 13:32    [12838426]     Ответить | Цитировать Сообщить модератору
 Re: сортировка данных XML  [new]
A-LeXus
Member

Откуда: Latvia, Jurmala
Сообщений: 63
Glory,

с помошью case, если возможно

;WITH OrderedRecords AS (
SELECT ROW_NUMBER() OVER(
-- ORDER BY
--CASE WHEN @p_sortDesc = 'True' THEN
--CASE WHEN @p_sortBy = 'Receiver_id'
-- WHEN @p_sortBy = 'id' THEN 'pubs!1!PubName'

-- END
--END DESC
--CASE WHEN @p_sortDesc = 'True' THEN
--CASE WHEN @p_sortBy = 'id' THEN [TimeStamp]
-- ELSE AuditID
--END
--END DESC,

--CASE WHEN @p_sortDesc = 'False' THEN
-- CASE WHEN @p_sortBy = 'AuditID' THEN AuditID
-- WHEN @p_sortBy = 'id' THEN id

-- END
--END ASC,
-- CASE WHEN @p_sortDesc = 'False' THEN
--CASE WHEN @p_sortBy = 'id' THEN [TimeStamp]
-- ELSE AuditID
--END
--END ASC

) AS RowNumber, * FROM (
-- SELECT
select AuditId ,EventId,ActivityId,
--as '@id',
(SELECT cast ('<'+LTRIM(RTRIM(AuditDataKeys.KeyName))>' +'<![CDATA['+LTRIM(RTRIM(AuditDataValues.Value)) +']]>'+ '</'+LTRIM(RTRIM(AuditDataKeys.KeyName))+'>' as xml) AS 'node()'
FROM DataKeys INNER JOIN
DataValues ON DataKeys.KeyId = DataValues.KeyId
)
) as Records)
SELECT * FROM OrderedRecords
9 июл 12, 13:38    [12838477]     Ответить | Цитировать Сообщить модератору
 Re: сортировка данных XML  [new]
Glory
Member

Откуда:
Сообщений: 104760
а стандартный FOR XML уже не в моде что ли ?
9 июл 12, 13:41    [12838503]     Ответить | Цитировать Сообщить модератору
 Re: сортировка данных XML  [new]
A-LeXus
Member

Откуда: Latvia, Jurmala
Сообщений: 63
Ну вот в том то и вопрос применяя

SELECT * FROM OrderedRecords

FOR XML PATH('AuditRecord'), ROOT('AuditData')

order by 'AuditData!AuditRecord!RowNumber'


Как правильно указать Таг по которуму сортировать
9 июл 12, 13:51    [12838592]     Ответить | Цитировать Сообщить модератору
 Re: сортировка данных XML  [new]
Glory
Member

Откуда:
Сообщений: 104760
A-LeXus
Как правильно указать Таг по которуму сортировать

Сортировать надо по полю, а не по тэгу.
9 июл 12, 13:52    [12838599]     Ответить | Цитировать Сообщить модератору
 Re: сортировка данных XML  [new]
A-LeXus
Member

Откуда: Latvia, Jurmala
Сообщений: 63
'AuditData!AuditRecord!RowNumber'


явно не правильно
9 июл 12, 13:52    [12838600]     Ответить | Цитировать Сообщить модератору
 Re: сортировка данных XML  [new]
A-LeXus
Member

Откуда: Latvia, Jurmala
Сообщений: 63
A-LeXus,
У меня динамичекая таблица из которой собираем Ключ-значение.
Как таковой колонки нет по которой я бы сортировал.
9 июл 12, 13:54    [12838624]     Ответить | Цитировать Сообщить модератору
 Re: сортировка данных XML  [new]
Glory
Member

Откуда:
Сообщений: 104760
A-LeXus
Как таковой колонки нет по которой я бы сортировал.

Чудеса просто - в запросе колонки нет, а в результате есть ?
9 июл 12, 13:55    [12838633]     Ответить | Цитировать Сообщить модератору
 Re: сортировка данных XML  [new]
user89
Member

Откуда:
Сообщений: 2083
A-LeXus,

???
declare @x xml
set @x = '<Data>
  <Record>
    <RowNumber>2</RowNumber>
<EventId>1</EventId>
<ActivityId>00000000-0000-0000-0000-000000000000</ActivityId>
  </Record>
  <Record>
    <RowNumber>1</RowNumber>
<EventId>1</EventId>
<ActivityId>00000000-0000-0000-0000-000000000000</ActivityId>
  </Record>
  <Record>
    <RowNumber>3</RowNumber>
<EventId>1</EventId>
<ActivityId>00000000-0000-0000-0000-000000000000</ActivityId>
  </Record>
</Data>'

select
N1.n.value('(RowNumber/text())[1]', 'bigint') [RowNumber],
N1.n.value('(EventId/text())[1]', 'bigint') [EventId],
N1.n.value('(ActivityId/text())[1]', 'uniqueidentifier') [ActivityId]
from @x.nodes('/Data/Record') AS N1(n)
order by RowNumber
for xml path('Record'), root ('Data')
9 июл 12, 16:01    [12839640]     Ответить | Цитировать Сообщить модератору
 Re: сортировка данных XML  [new]
A-LeXus
Member

Откуда: Latvia, Jurmala
Сообщений: 63
user89,
Спасибо!
очень близко к тому что надо... дальше попробую написать!
9 июл 12, 16:47    [12840005]     Ответить | Цитировать Сообщить модератору
 Re: сортировка данных XML  [new]
A-LeXus
Member

Откуда: Latvia, Jurmala
Сообщений: 63
user89,

Собственно вот так:

;WITH OrderedRecords AS (
SELECT ROW_NUMBER() OVER(
 ORDER BY 
 CASE WHEN @p_sortDesc = 'True' THEN
  CASE WHEN @p_sortBy = 'FirstName' THEN data.value('(ControlActProcess_authorOrPerformer_assignedPerson_name_given/text())[1]', 'varchar(250)')
       WHEN @p_sortBy = 'CreationTime' THEN data.value('(CreationTime/text())[1]', 'varchar(150)')   
       WHEN @p_sortBy = 'LastName' THEN data.value('(ControlActProcess_authorOrPerformer_assignedPerson_name_family/text())[1]', 'varchar(250)') 

    END
 END DESC,
 --CASE WHEN @p_sortDesc = 'True' THEN
 --CASE WHEN @p_sortBy = 'id' THEN [TimeStamp] 
 --     ELSE AuditID
 --END
 --END DESC,
 
 CASE WHEN @p_sortDesc = 'False' THEN
  CASE WHEN @p_sortBy = 'FirstName' THEN data.value('(ControlActProcess_authorOrPerformer_assignedPerson_name_given/text())[1]', 'varchar(250)') 
       WHEN @p_sortBy = 'CreationTime' THEN data.value('(CreationTime/text())[1]', 'varchar(150)')      
       WHEN @p_sortBy = 'LastName' THEN data.value('(ControlActProcess_authorOrPerformer_assignedPerson_name_family/text())[1]', 'varchar(250)') 

    END 
 END ASC
 -- CASE WHEN @p_sortDesc = 'False' THEN
 --CASE WHEN @p_sortBy = 'id' THEN [TimeStamp] 
 --     ELSE AuditID
 --END
 --END ASC
 
) AS RowNumber, * FROM ( 
-- SELECT 
select  AuditId ,EventId,ActivityId,
...
 
9 июл 12, 18:31    [12840727]     Ответить | Цитировать Сообщить модератору
 Re: сортировка данных XML  [new]
Glory
Member

Откуда:
Сообщений: 104760
A-LeXus
Собственно вот так:

Круто. Сначала собрать данные в xml. А потом этот xml парсить для извлечения значений тэгов.
9 июл 12, 21:48    [12841356]     Ответить | Цитировать Сообщить модератору
 Re: сортировка данных XML  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Но зато как оно завораживающе фунчиклирует.
10 июл 12, 00:47    [12841896]     Ответить | Цитировать Сообщить модератору
 Re: сортировка данных XML  [new]
grigrim
Member

Откуда: Москва
Сообщений: 89
Недавно столкнулся с похожей проблемой.
Возможно, кому-то подойдёт такое решение:
declare @xml xml
set @xml =
'<Data>
	<Record>
		<RowNumber>2</RowNumber>
		<EventId>1</EventId>
		<ActivityId>00000000-0000-0000-0000-000000000000</ActivityId>
	</Record>
	<Record>
		<RowNumber>1</RowNumber>
		<EventId>1</EventId>
		<ActivityId>00000000-0000-0000-0000-000000000000</ActivityId>
	</Record>
	<Record>
		<RowNumber>3</RowNumber>
		<EventId>1</EventId>
		<ActivityId>00000000-0000-0000-0000-000000000000</ActivityId>
	</Record>
</Data>'

SELECT @xml.query('
  <Data>
    {  for $i in /Data/Record order by $i/RowNumber[1]
       return $i
    }
  </Data>
')
29 авг 12, 17:50    [13084362]     Ответить | Цитировать Сообщить модератору
 Re: сортировка данных XML  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
grigrim, как вы не понимаете что не нужно оно. Эта проблема только от круворукости системы.
Нужно или сразу в источнике правильно формировать XML или делать там где это положено - не на СУБД.
31 авг 12, 01:33    [13092412]     Ответить | Цитировать Сообщить модератору
 Re: сортировка данных XML  [new]
grigrim
Member

Откуда: Москва
Сообщений: 89
Mnior, в идеале, конечно, так. Я согласен.
Но ведь могут быть ситуации, когда в базу приходит уже сформированный XML, и нет возможности повлиять на сортировку заранее, при его формировании. А дальше этот XML нужно каким-то образом показывать правильно отсортированным.
31 авг 12, 10:14    [13093061]     Ответить | Цитировать Сообщить модератору
 Re: сортировка данных XML  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
grigrim
А дальше этот XML нужно каким-то образом показывать правильно отсортированным.
В том то и дело, показать где? Явно не на сервере, поэтому там где надо показать, пусть и сортируют.
Поэтому в любых ситуациях этого не нужно на скуле.
31 авг 12, 12:56    [13094243]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить