2017-11-11 100 views
1

SQL Server 2012的開發版SQL服務器CONCAT多個值,並返回作爲單列

TESTMACHINE

OID MACHINENAME 
--------------- 
1 TEST A 
2 TEST B 
3 TEST C 

TESTDETAIL

OID TESTMACHINEOID TESTID HISTORYID 
------------------------------------- 
1  1   200   100 
2  1   300   250 
3  2   1000  2345 
4  3   100   150 

TestMachineOID是FK到TestMachine

我需要通過分組TestMachineOID將項連接成XML。是否有可能獲得以下所需的輸出?

TESTMACHINEOID TESTMACHINENAME  TEXTXML 
------------------------------------------------------------------------ 
1     TEST A   <REC><TESTID>200</TESTID><HISTORYID>100<HISTORYID><TESTID>300</TESTID><HISTORYID>250<HISTORYID></REC> 
2     TEST B   <REC><TESTID>1000</TESTID><HISTORYID>2345<HISTORYID></REC> 
3     TEST C   <REC><TESTID>100</TESTID><HISTORYID>150<HISTORYID></REC> 

回答

1
drop table #testmachine 
drop table #testdetail 

create table #testmachine (oid int , name nvarchar(10)) 
create table #testdetail (oid int, machineoid int, testid int, historyid int) 

insert into #testmachine (oid, name) values (1,'A') 
insert into #testmachine (oid, name) values (2,'B') 
insert into #testmachine (oid, name) values (3,'C') 

insert into #testdetail (oid, machineoid,testid,historyid) values (1,1,10,20) 
insert into #testdetail (oid, machineoid,testid,historyid) values (2,1,30,40) 
insert into #testdetail (oid, machineoid,testid,historyid) values (3,2,50,60) 
insert into #testdetail (oid, machineoid,testid,historyid) values (4,2,70,80) 
insert into #testdetail (oid, machineoid,testid,historyid) values (5,3,90,100) 


select 
     tm.oid, 
     tm.name, 
     (   
      select testid, historyid 
      from #testdetail td 
      where td.machineoid = tm.oid 
      for xml path('rec') , root('signal') 
     ) as XMLvalue 

from 
     #testmachine tm 

輸出

1 A <signal><rec><testid>10</testid><historyid>20</historyid></rec><rec><testid>30</testid><historyid>40</historyid></rec></signal> 
2 B <signal><rec><testid>50</testid><historyid>60</historyid></rec><rec><testid>70</testid><historyid>80</historyid></rec></signal> 
3 C <signal><rec><testid>90</testid><historyid>100</historyid></rec></signal> 
0

你需要的是一個「for循環」,並用它填充一個表。

循環遍歷testmachine表和每個OID選擇testdetail所有記錄,然後與另一種嵌套for循環與子句添加逐一

SET TESTXML = CONCAT(TESTXML,NEW_VALUE)