2011-01-11 3 views
3

Я пытаюсь вставить данные с помощью XML в SQL Server. Используемый мной XML являетсяМассовая вставка из XML в SQL Server

<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 в таблице temp. Я пробовал использовать

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 

Но я получаю Null in 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' 

Replace @input с переменной или столбца, который содержит ваш XML (I» я использовал @input в качестве тестового слоя в своих тестах).

Результат выглядит следующим образом:

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

И, конечно же, вы можете также сделать INSERT INTO .... и использовать выход из этого SELECT в качестве значений для вставки.

Update: если ваш столбец 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] нотацию. Как я буду ссылаться на все строки. –

+2

+1 Сервер Sql Server 2005, используя собственные функции xml, лучше, чем использование 'openxml'. –

Смежные вопросы