2015-09-08 9 views
6

TLDR;SQLXML属性を1つのテーブルに一括にロードする

SQLXML Bulk Loader(4.0)を使用して、このようなXMLをロードしようとしています。

<?xml version = "1.0" encoding = "UTF-8"?> 
<CarSales> 
<Client> 
    <ID >3</ID> 
    <ClientName>John Smith3</ClientName> 
    <Country name="Colombia"/> 
</Client> 
<Client> 
    <ID>7</ID> 
    <ClientName>Slow Sid</ClientName> 
    <Country name="Bolivia"/> 
</Client> 
<Client> 
    <ID>10</ID> 
    <ClientName>Missing Town</ClientName> 
    <Country name="Argentina"/> 
</Client> 
</CarSales> 

私は国のname属性は、私は(もクライアント名を保持している「Client_XMLBulkLoad」、およびID)を使用しています唯一のテーブルの列に捕獲することにしたいです。それは可能ですか?


詳細

ここでは、私は(コメントアウト "国" との)対応するXSDのために、これまで持っているものである

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sql = "urn:schemas-microsoft-com:mapping-schema"> 
<xsd:element name = "CarSales" sql:is-constant = "1" > 
    <xsd:complexType> 
    <xsd:sequence> 
    <xsd:element name = "Client" sql:relation="Client_XMLBulkLoad" 
      maxOccurs = "unbounded"> 
     <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name = "ID" type = "xsd:integer" 
        sql:field = "ID" /> 
     <xsd:element name = "ClientName" type = "xsd:string" 
        sql:field = "ClientName" /> 
     <!-- <xsd:element name="Country" minOccurs="0" maxOccurs="unbounded"> 
       <xsd:complexType> 
        <xsd:attribute name="name" type="xsd:string" sql:field = "Country" /> 
       </xsd:complexType> 
     </xsd:element> --> 
     </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 
    </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

私は、バルク・ロードをしようとすると、現状のままでは、「国」にスキーマの関係が想定されているというエラーが表示されます。しかし、私が読んでいるすべてのもので、リレーションシップは異なるテーブル間で設定され、他のすべてのデータと同じテーブルにアトリビュートをインポートするのではありません。

また、 "国"要素に "is-constant =" 1 ""フラグを設定しようとしましたが、「固定/固定要素には属性を設定できません」というエラーが発生します。

国名がクライアントの名前とIDと同じテーブルに含まれている場合、どのようにして国名を取得できますか?

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema id="NewDataSet" targetNamespace="http://scap.nist.gov/schema/feed/vulnerability/2.0" xmlns:mstns="http://scap.nist.gov/schema/feed/vulnerability/2.0" xmlns="http://scap.nist.gov/schema/feed/vulnerability/2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified" xmlns:app1="http://scap.nist.gov/schema/vulnerability/0.4" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:sql="urn:schemas-microsoft-com:mapping-schema"> 
    <xs:import namespace="http://scap.nist.gov/schema/vulnerability/0.4" schemaLocation="DELTE_app1.xsd" /> 
    <xs:element name="nvd" sql:is-constant = "1"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="entry" minOccurs="0" maxOccurs="unbounded" sql:relation="NVD.CVE"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="app1:cwe" minOccurs="0"/> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

スキーマの子:私は

<?xml version="1.0" standalone="yes"?> 
<xs:schema targetNamespace="http://scap.nist.gov/schema/vulnerability/0.4" xmlns:mstns="http://scap.nist.gov/schema/feed/vulnerability/2.0" xmlns="http://scap.nist.gov/schema/vulnerability/0.4" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" attributeFormDefault="qualified" elementFormDefault="qualified" xmlns:app2="http://cpe.mitre.org/language/2.0" xmlns:app3="http://scap.nist.gov/schema/cvss-v2/0.2" xmlns:sql="urn:schemas-microsoft-com:mapping-schema"> 
    <xs:element name="cwe" msdata:Prefix="vuln" sql:field="CWE"> 
    <xs:complexType> 
     <xs:simpleContent> 
      <xs:extension base="xs:string"> 
       <xs:attribute name="id" form="unqualified" type="xs:string" sql:field="CWE"/> 
      </xs:extension> 
     </xs:simpleContent> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

XMLファイルここ


は、私が使用しています実際のスキーマ(それは、ネストされたスキーマです)

スキーマのルートです読み込み:

<?xml version='1.0' encoding='UTF-8'?> 
<nvd xmlns:scap-core="http://scap.nist.gov/schema/scap-core/0.1" xmlns:cvss="http://scap.nist.gov/schema/cvss-v2/0.2" xmlns:vuln="http://scap.nist.gov/schema/vulnerability/0.4" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:patch="http://scap.nist.gov/schema/patch/0.1" xmlns="http://scap.nist.gov/schema/feed/vulnerability/2.0" xmlns:cpe-lang="http://cpe.mitre.org/language/2.0" nvd_xml_version="2.0" pub_date="2015-07-10T03:00:00" xsi:schemaLocation="http://scap.nist.gov/schema/patch/0.1 http://nvd.nist.gov/schema/patch_0.1.xsd http://scap.nist.gov/schema/feed/vulnerability/2.0 http://nvd.nist.gov/schema/nvd-cve-feed_2.0.xsd http://scap.nist.gov/schema/scap-core/0.1 http://nvd.nist.gov/schema/scap-core_0.1.xsd"> 
<entry id="CVE-2015-0016"> 
    <vuln:cwe id="CWE-22"/> 
    </entry> 
</nvd> 

これは機能しますが、要素レベルと属性レベルの両方で[sql:field = "CWE"]を設定する必要があります。私はその余分な "sql:field"を置かないと、 "カラム 'cwe'がスキーマで定義されていても、データベースに存在しないというエラーが表示されます。その要素に「定数です」タグを追加すると、定数要素に属性エラーを含めることができなくなります。私が見つけた唯一の解決策は、それを重複してsql:field = "CWE"に割り当てることです。

答えて

3

単純な内容の複雑な型定義が必要なのは、sqlフィールドのアドレス指定です。
<xsd:simpleContent> Element<xsd:extension> Element (complexContent)をご覧ください。
私はテストしていませんが、スキーマに従っている必要があります。
更新:私はちょうど今テストしましたが、期待通りに動作します。

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sql="urn:schemas-microsoft-com:mapping-schema"> 
    <xsd:element name="CarSales" sql:is-constant="1"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name="Client" sql:relation="Client_XMLBulkLoad" maxOccurs="unbounded"> 
      <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="ID" type="xsd:integer" sql:field="ID"/> 
       <xsd:element name="ClientName" type="xsd:string" sql:field="ClientName"/> 
       <xsd:element name="Country" minOccurs="0" maxOccurs="unbounded"> 
       <xsd:complexType> 
        <xsd:simpleContent> 
        <xsd:extension base="xsd:string"> 
         <xsd:attribute name="name" type="xsd:string" sql:field="Country"/> 
        </xsd:extension> 
        </xsd:simpleContent> 
       </xsd:complexType> 
       </xsd:element> 
      </xsd:sequence> 
      </xsd:complexType> 
     </xsd:element> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 
+0

これは1つのフォローアップの質問で機能しました。問題のXMLは、私が作業しているものの単純化された例です。私の実際のケースでは、 "Country"要素は実際に別の列名にマッピングされます(列は "Citizenship"と呼ばれます)。属性に「sql:field = "Citizenship"」を追加しましたが、「国」が既知の列ではないというエラーが表示されました。そこで、スキーマの属性に加えて、 "Country"要素に "sql:field =" Citizenship "を追加しました。正しいことをしましたか?それ以降、属性と要素の両方が"sql:field =" Citizenship " – n00b

+0

@ n00b XMLファイルとスキーマファイルが必要です。 –

+0

質問のXMLを含む私の更新された質問を見てください。 「sql:field = "CWE"」という要素を追加しなければならないことに注意してください。これを修正するには、どこかありますか、何が起こっているか教えてください。 – n00b