我想知道如何在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; = 罗宾范佩西目标。我不确定要修改表格的查询...
答案 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
。