2014-12-27 1 views
1

Я хотел бы знать, как перемещать строку в вверх или вниз на сервере sql в зависимости от значения в столбце слева. Например, это мой стол:Переместить ввод строки на один в зависимости от значения в столбце слева

nodetype localname text 
1  events NULL 
1  event  NULL 
2  id  NULL 
3  #text  21515 
2  side  NULL 
3  #text  Away 
2  type  NULL 
3  #text  Goal 
1  result NULL 
3  #text  <b>Robin Van Persie</b>Goal 

Все, что с #text из столбца «LocalName» Я хочу, чтобы переместить запись строки из столбца «текст» вверх по одному. Поэтому 'id' соответствует 21515, 'side' = Away, 'type' = Goal и 'result' = Robin Van Persie Цель. Я не уверен в запросе на изменение таблицы ...

+0

Похоже, вы задаете неправильный вопрос - исходные данные для этой таблицы выглядят так, как будто она имеет структуру, необходимую для решения этого вопроса гораздо более непосредственно. Не могли бы вы добавить больше контекста? – codekaizen

+0

Я использовал openrowset для запроса xml и импорта в таблицу sql serer. Xml имеет временную шкалу футбольного матча, и каждая запись имеет описание события. Это, как он выложил: - - <событие ID = "21536609" часы = сторона = "прочь" типа "24" = "Yellowcard" addedTime = "" VideoID = ""> - - Майкл Доусон - 24'
Yellow Card ]]>

+0

Так что вы хотите: 'ID = 21515; side = Away; type = Цель; result = Robin Van Persie Goal'? – codekaizen

ответ

1

Вы можете получить дополнительную информацию, если вы измените входящие данные. Вот пример, основанный на данных, которые вы мне дали:

/* setup storage for xml data */ 
declare @r table(data xml) 

/* get xml data, either from string or file */ 
insert into @r 
select cast('<events><event id="21536609" clock="24" side="away" type="yellowCard" addedTime="" videoId=""><result><![CDATA[ <b>Michael Dawson</b> - 24''<br>Yellow Card ]]> </result> </event> </events>' as xml) 
--select CONVERT(xml, BulkColumn, 2) data from openrowset(Bulk 'd:\temp\f.xml', SINGLE_BLOB) [rowsetresults] 

/* for each 'event' element in the source, pull out the attribute values and the first result */ 
select * 
from (
select e.value('./@id', 'bigint') id, 
    e.value('./@clock', 'int') clock, 
    e.value('./@side', 'nvarchar(100)') side, 
    e.value('./@type', 'nvarchar(100)') type, 
    e.value('(./result/text())[1]', 'nvarchar(max)') result 
from (select * from @r) t 
cross apply t.data.nodes('/events/event') as t2(e) 
) events 

Обратите внимание, что вы получите значения в столбчатой ​​форме против форме строки (например, ключ/значение пары, как ваш вопрос показывает). Это легко повернуть к строке, но также столбчатая форма обычно предпочтительна в сценариях SQL.

Также обратите внимание, что это только вытаскивает первый результат в каждом событии. Чтобы вытащить все результаты, вам нужно будет cross apply на уровне элемента result.

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