将行输入向上移动一个,具体取决于左侧列中的值

时间:2014-12-27 22:25:28

标签: sql-server xml sqlxml

我想知道如何在sql server中向上或向下移动行条目,具体取决于其左侧列的值。例如,这是我的表:

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

来自列&#39; localname&#39;的#text的任何内容我希望从列&#39; text&#39;中移动行条目。一个人。所以&#39; id&#39;对应于21515,&#39; side&#39; =离开,&#39;键入&#39; =目标和&#39;结果&#39; = 罗宾范佩西目标。我不确定要修改表格的查询...

1 个答案:

答案 0 :(得分: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