2011-01-11 194 views
3

我想在SQL Server中使用XML插入數據。我正在使用的XML是從SQL Server中的XML批量插入

<ArrayOfInfringementEntity xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <InfringementEntity> 
     <infringementNumber>12345678911</infringementNumber> 
     <issueAgency>017</issueAgency> 
     <infringementType>1A</infringementType> 
     <infringementStatus>0</infringementStatus> 
     <batchRecordId>0</batchRecordId> 
     <incidentDate xsi:nil="true" /> 
     <infringementSource>OTS</infringementSource> 
     <TypeOfNotice>0</TypeOfNotice> 
     <offenceEntity> 
      <offenceCode>7777</offenceCode> 
      <offenceDate>1999-05-31T00:00:00</offenceDate> 
      <offenceTime>121212</offenceTime> 
      <offenceLocation>ST56789</offenceLocation> 
      <offenceOwnerType>0</offenceOwnerType> 
      <offenceSuburb>SOUTH YARRA</offenceSuburb> 
      <site>ST56789</site> 
      <detectedSpeed>70</detectedSpeed> 
      <allegedSpeed>60</allegedSpeed> 
      <permittedSpeed>50</permittedSpeed> 
      <timeInRedLight>40</timeInRedLight> 
      <tollAmount>140</tollAmount> 
      <enforcementAllowance>310</enforcementAllowance> 
      <lookUpFee>510</lookUpFee> 
      <invoiceFee>130</invoiceFee> 
     </offenceEntity> 
     <vehicleEntity> 
      <vehicleClass>2</vehicleClass> 
      <vehicleMake>BMW</vehicleMake> 
      <vehicleModel>FOUR WHEELER</vehicleModel> 
      <bodyType>HEAVY</bodyType> 
      <primaryColour>GRN</primaryColour> 
      <manufactureYear>2010</manufactureYear> 
      <gvm>111</gvm> 
      <gcm>210</gcm> 
      <registrationNumber>CBD-1111</registrationNumber> 
      <registrationState>VIC</registrationState> 
     </vehicleEntity> 
     <obligationNumber>obligation1</obligationNumber> 
     <isDebtorDeceased>false</isDebtorDeceased> 
    </InfringementEntity> 
</ArrayOfInfringementEntity> 

我想在臨時表中撕碎這個XML。我試過使用

create table #InfTemp 

(infringementNumber Varchar(10),issueAgency varchar(5),infringementType varchar(5), offenceCode int,vehicleClass int,obligationNumber varchar(11) 
) 

Insert into #InfTemp 
    SELECT PLIxml.infringementNumber, PLIxml.issueAgency,PLIxml.infringementType, 
    PLIxml.offenceCode , PLIxml.vehicleClass ,PLIxml.obligationNumber 
    FROM OPENXML (@output, 'ArrayOfInfringementEntity/InfringementEntity',2) 
    WITH 
    ( infringementNumber Varchar(10),issueAgency varchar(5),infringementType varchar(5),offenceCode int,vehicleClass int,obligationNumber varchar(11) 
    ) PLIxml 

但是,我在Offencecode和車輛類中得到空值。據我所知,這是有道理的,因爲<offenceCode><offenceEntity>的子節點。而且我不是專門閱讀<offenceEntity>節點。請幫忙。

回答

3

根據您的XML,你可以使用這個XQuery的SELECT從XML提取您的物品:

select 
    @input.value('(/ArrayOfInfringementEntity/InfringementEntity/infringementNumber)[1]', 'VARCHAR(10)') 'InfringementNumber', 
    @input.value('(/ArrayOfInfringementEntity/InfringementEntity/issueAgency)[1]', 'VARCHAR(5)') 'Issue Agency', 
    @input.value('(/ArrayOfInfringementEntity/InfringementEntity/infringementType)[1]', 'VARCHAR(5)') 'Infringement Type', 
    @input.value('(/ArrayOfInfringementEntity/InfringementEntity/offenceEntity/offenceCode)[1]', 'INT') 'Offence Code', 
    @input.value('(/ArrayOfInfringementEntity/InfringementEntity/vehicleEntity/vehicleClass)[1]', 'INT') 'Vehicle Class', 
    @input.value('(/ArrayOfInfringementEntity/InfringementEntity/obligationNumber)[1]', 'VARCHAR(11)') 'Obligation Number' 

替換@input與握着你的XML變量或列(I」我在測試中使用了@input作爲測試牀)。

輸出看起來是這樣的:

InfringementNumber Issue Agency Infringement Type Offence Code Vehicle Class Obligation Number 
1234567891    017    1A    7777   2    obligation1 

和當然,你也可以做一個INSERT INTO ....和使用來自該SELECT輸出作爲插入值。

更新:如果你的XML列包含多個條目(的/InfringementEntity/ArrayOfInfringementEntity內),您需要使用SELECT這樣的:

SELECT 
    InfrEntity.value('(infringementNumber)[1]', 'VARCHAR(10)') 'InfringementNumber', 
    InfrEntity.value('(issueAgency)[1]', 'VARCHAR(5)') 'Issue Agency', 
    InfrEntity.value('(infringementType)[1]', 'VARCHAR(5)') 'Infringement Type', 
    InfrEntity.value('(offenceEntity/offenceCode)[1]', 'INT') 'Offence Code', 
    InfrEntity.value('(vehicleEntity/vehicleClass)[1]', 'INT') 'Vehicle Class', 
    InfrEntity.value('(obligationNumber)[1]', 'VARCHAR(11)') 'Obligation Number' 
from 
    (yourXMLcolumn).nodes('/ArrayOfInfringementEntity/InfringementEntity') as ArrInfr(InfrEntity) 
+0

我不知道我會在XML中獲得多少行數據。據我所知,你已經使用[1]符號來引用節點。我將如何參考所有行。 – 2011-01-11 18:29:04