XML xs: выбор SQLXMLBulkload - PullRequest
1 голос
/ 21 апреля 2009

У меня есть несколько XML-файлов, которые мне нужны для пакетной обработки в SQL Server. В следующих разделах схемы и XML описывается область, с которой у меня возникают проблемы.

<xs:complexType>
    <xs:sequence>
        <xs:choice maxOccurs="unbounded">
            <xs:element name="TextLine" type="xs:string" sql:field="AdvertLine" sql:relation="XmlAdvert" sql:relationship="XmlAdvert" />
            <xs:element name="BreakPoint" sql:is-constant="1" />
        </xs:choice>
    </xs:sequence>
</xs:complexType>

<Advert>
 <AdvertText>
  <TextLine>Isuzu 4 X 4TRUCKMAN</TextLine> 
  <BreakPoint /> 
  <TextLine>2.0TD, Red, 5 dr, 60,000 miles, MOT, 5 SEATER</TextLine> 
  <BreakPoint /> 
  <TextLine>£2500</TextLine>
  <BreakPoint /> 
  <TextLine>01234 567890</TextLine> 
 </AdvertText>
</Advert>

Но поскольку xs: choice не поддерживается в SQLXMLBulkload, я подумал, существует ли другой способ представления этого, поскольку без раздела xs: choice последовательность xs: недопустима, как только она попадает во вторую TextLine.

1 Ответ

0 голосов
/ 21 апреля 2009

Я не знаком с SQLXMLBulkload, но вот мои мысли:

Я не уверен, есть ли какая-либо связь между смежными элементами TextLine и BreakPoint. Если предположить, что нет, то простейшим решением может быть использование XSLT для преобразования схемы и данных, чтобы исключить необходимость в choice.

Обратите внимание, что я вставил maxOccurs="unbounded" в оба элемента. Если это не работает, есть альтернативный подход, который должен работать; см. ниже.

<xs:complexType>
    <xs:sequence>
        <xs:element name="TextLine" type="xs:string" sql:field="AdvertLine" sql:relation="XmlAdvert" sql:relationship="XmlAdvert" maxOccurs="unbounded"/>
        <xs:element name="BreakPoint" sql:is-constant="1" maxOccurs="unbounded"/>
    </xs:sequence>
</xs:complexType>

Эквивалентный XML будет:

<Advert>
 <AdvertText>
  <TextLine>Isuzu 4 X 4TRUCKMAN</TextLine> 
  <TextLine>2.0TD, Red, 5 dr, 60,000 miles, MOT, 5 SEATER</TextLine> 
  <TextLine>£2500</TextLine>
  <TextLine>01234 567890</TextLine> 
  <BreakPoint /> 
  <BreakPoint /> 
  <BreakPoint /> 
 </AdvertText>
</Advert>

Но, насколько я знаю, SQLXMLBulkload тоже не понравится. В этом случае, основываясь только на вашем примере XML, я бы поспорил, что он примет это:

с соответствующим XML-кодом:

<Advert>
 <AdvertText>
    <TextLines>
      <TextLine>Isuzu 4 X 4TRUCKMAN</TextLine> 
      <TextLine>2.0TD, Red, 5 dr, 60,000 miles, MOT, 5 SEATER</TextLine> 
      <TextLine>£2500</TextLine>
      <TextLine>01234 567890</TextLine>
    </TextLines> 
  <BreakPoints> 
      <BreakPoint /> 
      <BreakPoint /> 
      <BreakPoint /> 
  </BreakPoints> 
 </AdvertText>
</Advert>

Это все еще оставляет открытым вопрос о том, как написать XSLT, который вам нужен, но, возможно, это начало.

...