使用标记将SQL行转换为xml

时间:2016-12-06 19:51:36

标签: sql-server xml

我有以下查询:

select 
t.location_id as Station_ID 
 ,' ' as Trans_register 
 ,timp.hose_num as Trans_Pump 
 ,t.invoice as Trans_Receipt 
 ,t.pos_date as Trans_Date_Time 
 ,' ' as Trans_Batch 
 ,' ' as Trans_Batch_Sequence 
 ,CASE 
WHEN im.org_id = 125 and l.chain_id = 10 THEN "EC" 
WHEN im.org_id = 125 and l.chain_id <> 10 THEN "ER" 
WHEN im.org_id = 165 and l.chain_id = 10 and t.stmt_id <> -4 THEN "DC" 
WHEN im.org_id = 165 and l.chain_id = 10 and t.stmt_id = -4 THEN "IC" 
WHEN im.org_id = 165 and l.chain_id <> 10 and t.stmt_id <> -4 THEN "DR" 
WHEN im.org_id = 165 and l.chain_id <> 10 and t.stmt_id = -4 THEN "IR" 
ELSE "EC" END as Trans_Origin 
,t.trans_date as Trans_Process_Date_Time 
,CASE 
 WHEN l.chain_Id <> 10 then t.pref_total 
 ELSE 0 END as Trans_Amount 
,CASE 
 WHEN l.chain_id <> 10 THEN tltg.amount 
 ELSE 0 END as Trans_GST_Amount 
,CASE 
 WHEN l.chain_id <> 10 THEN tltp.amount 
 ELSE 0 END as Trans_PST_Amount 
,' ' as Loyalty_Program 
,' ' as Loyalty_Account_Number 
,' ' as Loyalty_Fee 
,CASE 
 WHEN l.chain_Id <> 10 then t.pref_total 
 ELSE 0 END as Trans_Loyalty_Amount 


,tl.line_id + 1 as Product_Sequence 
,CASE 
 WHEN tl.cat in ("DEF","DEFD") then 4194304 
 --DEV need to add that if it's not DEF, DEFD and fuel type is 0 using the tl.cat but that wasn't working for me...need smarties to do that! 
 ELSE tl.fuel_type end as Product_Code 
,tl.qty as Product_Qty --will always be Litres since Canada 
,CASE 
 WHEN l.chain_id <> 10 then tl.amt else 0 end as Product_Amount 
,' ' as Product_Loyalty_Amount 
,tltf.amount as Product_FET_Amount 
,tltf.tax_rate as Product_FET_Unit_Amount 
,CASE 
 WHEN l.chain_id <> 10 THEN tltg.amount 
 ELSE 0 END as Product_GST_Amount 
,CASE 
 WHEN l.chain_id <> 10 THEN tltg.tax_rate 
 ELSE 0 END as Product_GST_Unit_Amount 
,tltpf.amount as Product_PFT_Amount 
,tltpf.tax_rate as Product_PFT_Unit_Amount 
,CASE 
 WHEN l.chain_id <> 10 THEN tltp.amount 
 ELSE 0 END as Product_PST_Amount 
,CASE 
 WHEN l.chain_id <> 10 THEN tltp.tax_rate 
 ELSE 0 END as Product_PST_Unit_Amount 
,tltv.amount as Product_MFT_Amount 
,tltv.tax_rate as Product_MFT_Unit_Amount 


,tl.line_id + 1 as Tender_Sequence 
,t.Carrier_Id as Tender_Account 
,' ' as Tender_Unit_Card_Number 
,CASE 
 WHEN im.org_id = 165 then "19" ELSE "18" END as Tender_Type 
,CASE 
 WHEN l.chain_Id <> 10 then t.pref_total 
 ELSE 0 END as Tedner_Amount 
,' ' as Tender_Fee_Amt 
,ca.expiredate as Tender_Exp_date 
,t.auth_code as Authorization_Code 
,CASE WHEN t.extra_3 in (3,7) then "N" else "Y" END as Authorization_Method 
,' ' as Fi_Termid 
,' ' as Fi_Sequence 
,tiu.info as Unit_Number 
,tio.info as Odometer_Number 
,tid.info as Driver_Number 
,tip.info as Trip_Number 
,' ' as Reference_Number 
,tit.info as Trailer_Number 
,' ' as Trailer_Hub 
,tihb.info as Tractor_Hub 
,' ' as Check_Digit 
,' ' as FI_Response_Code 
,left(t.card_num,6) as FI_ISO_Code 

from 
transaction as t 

left outer join 
trans_imperial as timp 
on t.trans_id = timp.trans_id 
left outer join location as l 
  on t.location_id = l.location_id 
left outer join contract as c 
  on t.contract_id = c.contract_id 
left outer join issuer_misc as im 
 on c.issuer_id = im.issuer_id 
left outer join trans_line_tax as tltg 
on t.trans_id = tltg.trans_id 
and tltg.tax_cd IN ("GST","HST","FNT") and tltg.gross_net_flag = "N" and tltg.exempt_flag = "N" 
left outer join trans_line_tax as tltp 
on t.trans_id = tltp.trans_id 
and tltp.tax_cd IN ("PST","QST") and tltp.gross_net_flag = "N" and tltp.exempt_flag = "N" 
left outer join trans_line as tl 
on t.trans_id = tl.trans_id 

left outer join trans_line_tax as tltf 
on t.trans_id = tltf.trans_id 
and tltf.tax_cd = "FET" and tltf.gross_net_flag = "N" and tltf.exempt_flag = "N" 

left outer join trans_line_tax as tltpf 
on t.trans_id = tltpf.trans_id 
and tltpf.tax_cd = "PFT" and tltpf.gross_net_flag = "N" and tltpf.exempt_flag = "N" 

left outer join trans_line_tax as tltv 
on t.trans_id = tltv.trans_id 
and tltv.tax_cd = "VTT" and tltv.gross_net_flag = "N" and tltv.exempt_flag = "N" 

left outer join cards as ca 
on t.card_num = ca.card_num 

left outer join trans_info as tiu 
on t.trans_id = tiu.trans_id 
and tiu.type = "UNIT" 

left outer join trans_info as tio 
on t.trans_id = tio.trans_id 
and tio.type = "ODRD" 

left outer join trans_info as tid 
on t.trans_id = tid.trans_id 
and tid.type = "DRID" 

left outer join trans_info as tip 
on t.trans_id = tip.trans_id 
and tip.type = "TRIP" 

left outer join trans_info as tit 
on t.trans_id = tit.trans_id 
and tit.type = "TRLR" 

left outer join trans_info as tihb 
on t.trans_id = tihb.trans_id 
and tihb.type = "HBRD" 

where 
 t.extra_5 = 20161204 
 and l.src_country = "CAN"

执行时的上述查询给出如下结果: enter image description here

我想要的结果是xml格式如下:

<?xml version=”1.0” encoding=”UTF-16” standalone=”yes”?>
<EFS_92_Completion_XML_FILE>
<File_Creation_Date>201605271023</File_Creation_Date>
<Record_Count>1</Record_Count>                      
<Trans>                                             
<Station_ID>9876</Station_ID>                               
<Trans_Register>99</Trans_Register>                             
<Trans_Pump>01</Trans_Pump>                                 
<Trans_Receipt>1234567</Trans_Receipt>                          
<Trans_Date_Time>201605271023</Trans_Date_Time>                     
<Trans_Batch>1234</Trans_Batch>                             
<Trans_Batch_Sequence>101</Trans_Batch_Sequence>                    
<Trans_Origin>RI</Trans_Origin>                             
<Trans_Process_Date_Time>201605281822</Trans_Process_Date_Time>         
<Trans_Amount>10.68</Trans_Amount>                          
<Trans_GST_Amount>0.51</Trans_GST_Amount>                       
<Trans_PST_Amount></Trans_PST_Amount>                       
<Loyalty_Program>HLR</Loyalty_Program>
<Loyalty_Account_Number>7076101117512061 </Loyalty_Account_Number>
<Loyalty_Fee></Loyalty_Fee>
<Trans_Loyalty_Amount>10.68</Trans_Loyalty_Amount>
<Product>
<Product_Sequence>1</Product_Sequence>
<Product_Code>0131</Product_Code>
<Trailer_Number></Trailer_Number>
<Trailer_Hub></Trailer_Hub>
<Tractor_Hub></Tractor_Hub>
<Check_Digit></Check_Digit>
<FI_Response_Code></FI_Response_Code >
<FI_ISO_Code></FI_ISO_Code >
</Tender>
</Trans>
</EFS_92_Completion_XML_FILE>

如何将SQL行转换为带标签的xml格式文件?我尝试添加FOR XML条款,但我没有成功。

1 个答案:

答案 0 :(得分:4)

再次查看FOR XML构造。 SO上有很多非常好的例子。如果将它放在WHERE子句之后,FOR XML PATH将适用于此。

SELECT Field1, Field2, Field3 
FROM Table1 
WHERE Field1 = SomeValue 
FOR XML PATH('ROW'), ROOT('XML')

这也有一些很棒的例子......

https://msdn.microsoft.com/en-us/library/bb510462.aspx