Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在sql server中扁平化xml数据_Sql Server_Xml - Fatal编程技术网

Sql server 在sql server中扁平化xml数据

Sql server 在sql server中扁平化xml数据,sql-server,xml,Sql Server,Xml,我在一个名为xml\u response的xml列(未键入)中有以下xml数据 <SEIContent> <Request> <eq:Charge> <v:Type>MaintCharge</v:Type> <v:Term>0</v:Term> <v:StartMonth>0</v:StartMonth> <v:EndMonth>0</v:EndM

我在一个名为xml\u response的xml列(未键入)中有以下xml数据

<SEIContent>    
<Request>
<eq:Charge>
  <v:Type>MaintCharge</v:Type>
  <v:Term>0</v:Term>
  <v:StartMonth>0</v:StartMonth>
  <v:EndMonth>0</v:EndMonth>
  <v:Rate>0</v:Rate>
  <v:RebateRatio>0</v:RebateRatio>
  <v:MaxRebate>0</v:MaxRebate>
  <v:TieredCharge>
    <v:Term>0</v:Term>
    <v:Rate>0.75</v:Rate>
    <v:LowerBand>0</v:LowerBand>
    <v:UpperBand>249999.99</v:UpperBand>
    <v:BandCurrency>GBP</v:BandCurrency>
  </v:TieredCharge>
  <v:TieredCharge>
    <v:Term>0</v:Term>
    <v:Rate>0.7</v:Rate>
    <v:LowerBand>250000</v:LowerBand>
    <v:UpperBand>499999.99</v:UpperBand>
    <v:BandCurrency>GBP</v:BandCurrency>
  </v:TieredCharge>
  <v:TieredCharge>
    <v:Term>0</v:Term>
    <v:Rate>0.6</v:Rate>
    <v:LowerBand>500000</v:LowerBand>
    <v:UpperBand>999999.99</v:UpperBand>
    <v:BandCurrency>GBP</v:BandCurrency>
  </v:TieredCharge>
  <v:TieredCharge>
    <v:Term>0</v:Term>
    <v:Rate>0.5</v:Rate>
    <v:LowerBand>1000000</v:LowerBand>
    <v:UpperBand>9999999.99</v:UpperBand>
    <v:BandCurrency>GBP</v:BandCurrency>
  </v:TieredCharge>
</eq:Charge>  
 <eq:Charge>
  <v:Type>MaintCharge</v:Type>
  <v:Term>0</v:Term>
  <v:StartMonth>0</v:StartMonth>
  <v:EndMonth>59</v:EndMonth>
  <v:Rate>1.5</v:Rate>
  <v:RebateRatio>0</v:RebateRatio>
  <v:MaxRebate>0</v:MaxRebate>
</eq:Charge>
<eq:Charge>
  <v:Type>MaintCharge</v:Type>
  <v:Term>0</v:Term>
  <v:StartMonth>60</v:StartMonth>
  <v:EndMonth>0</v:EndMonth>
  <v:Rate>0.5</v:Rate>
  <v:RebateRatio>0</v:RebateRatio>
  <v:MaxRebate>0</v:MaxRebate>
</eq:Charge>
<eq:Charge>
  <v:Type>QAC</v:Type>
  <v:Basis>FixedAmount</v:Basis>
  <v:Term>0</v:Term>
  <v:StartMonth>0</v:StartMonth>
  <v:EndMonth>0</v:EndMonth>
  <v:Rate>105</v:Rate>
  <v:RebateRatio>0</v:RebateRatio>
  <v:MaxRebate>0</v:MaxRebate>
</eq:Charge>
</Request>
<Response>
  <eq:Ref>QV00000393</eq:Ref>
</Response>
</SEIContent>

因此,诀窍是在查询的最后一位使用外部应用程序,这有点像内部连接。然后它就起作用了

WITH XMLNAMESPACES('http://lu/blah' AS eq, 'http://lu/blah2' AS v,
  DEFAULT 'http://lu/blah3'
 SELECT
 nref.value('Response[1]/eqRef[1]', 'nvarchar(200)') Ref,
 ncharge.value('v:Type[1]', 'nvarchar(50)') ChargeType,
 ncharge.value('v:Basis[1]', 'nvarchar(50)') ChargeBasis,
 ncharge.value('v:Term[1]', 'int') Term,
 ncharge.value('v:StartMonth[1]', 'int') StartMonth,
 ncharge.value('v:EndMonth[1]', 'int') EndMonth,
 ncharge.value('v:Rate[1]', 'money') Rate,
 ncharge.value('v:RebateRatio[1]', 'money') RebateRatio,
 ncharge.value('v:MaxRebate[1]', 'money') MaxRebate,
 tcharge.value('v:Term[1]', 'int') TieredTerm,
 tcharge.value('v:Rate[1]', 'money') TieredRate,
 tcharge.value('v:LowerBand[1]', 'money') TieredLowerBand,
 tcharge.value('v:UpperBand[1]', 'money') TieredUpperBand
 INTO #TempCharges
 FROM xml_response CROSS APPLY response_body.nodes('//SEIContent') AS Quote(nref) 
 CROSS APPLY response_body.nodes('//Request//eq:Charge') AS Charge(ncharge) 
 CROSS APPLY response_body.nodes('//Request//eq:Charge//v:TieredCharge') AS TieredCharge(tcharge)
 WHERE nref.value('Request[1]/eq:Product[1]', 'nvarchar(60)') <> 'AVL'

 select * from #TempCharges
 MaintChange TieredCharge1 row
 MaintChange TieredCharge2 row
 MaintChange TieredCharge3 row
 MaintChange TieredCharge4 row
 MaintCharge
 MaintCharge
 QAC