Sql OPENXML从XML中提取数据并添加到表中

Sql OPENXML从XML中提取数据并添加到表中,sql,openxml,Sql,Openxml,我有一个XML文件,希望从中获取数据并将其放入SQL表中。我的问题是同一个XML文件中的路径不同 比如, 一个路径=“根/描述符记录/描述符名称” 第二个路径='root/DescriptorRecord/ConceptList/Concept/TermList/Term' 我不知道如何从同一个XML中的两个不同路径获取值 以下是我的XML: <root> <DescriptorRecord DescriptorClass = "1"> <DescriptorN

我有一个XML文件,希望从中获取数据并将其放入SQL表中。我的问题是同一个XML文件中的路径不同

比如,

一个路径=
“根/描述符记录/描述符名称”

第二个路径=
'root/DescriptorRecord/ConceptList/Concept/TermList/Term'

我不知道如何从同一个XML中的两个不同路径获取值

以下是我的XML:

<root>
<DescriptorRecord DescriptorClass = "1">
  <DescriptorName>
   <String>abc</String>
  </DescriptorName>
  <ConceptList>
   <Concept PreferredConceptYN="Y">
    <TermList>
     <Term  ConceptPreferredTermYN="Y"  IsPermutedTermYN="N"  LexicalTag="NON"  PrintFlagYN="Y"  RecordPreferredTermYN="Y">
        <String>abc</String>
     </Term>
     <Term  ConceptPreferredTermYN="N"  IsPermutedTermYN="N"  LexicalTag="NON"  PrintFlagYN="N"  RecordPreferredTermYN="N">
        <String>pqr</String>
     </Term>
     <Term  ConceptPreferredTermYN="N"  IsPermutedTermYN="N"  LexicalTag="NON"  PrintFlagYN="Y"  RecordPreferredTermYN="N">
        <String>xyz</String>
    </Term>
   </TermList>
   </Concept>
  </ConceptList>
 </DescriptorRecord>
 <DescriptorRecord DescriptorClass = "1">
  <DescriptorName>
   <String>Numerics</String>
  </DescriptorName>
  <ConceptList>
   <Concept PreferredConceptYN="Y">
    <TermList>
     <Term  ConceptPreferredTermYN="Y"  IsPermutedTermYN="N"  LexicalTag="NON"  PrintFlagYN="Y"  RecordPreferredTermYN="Y">
        <String>123</String>
     </Term>
     <Term  ConceptPreferredTermYN="N"  IsPermutedTermYN="N"  LexicalTag="NON"  PrintFlagYN="N"  RecordPreferredTermYN="N">
        <String>456</String>
     </Term>
     <Term  ConceptPreferredTermYN="N"  IsPermutedTermYN="N"  LexicalTag="NON"  PrintFlagYN="Y"  RecordPreferredTermYN="N">
        <String>789</String>
    </Term>
   </TermList>
   </Concept>
  </ConceptList>
 </DescriptorRecord>
 </root>
结果:

预期结果


因此,在变量中设置样本:

DECLARE @X XML =  N'<root>
<DescriptorRecord DescriptorClass = "1">
  <DescriptorName>
   <String>abc</String>
  </DescriptorName>
  <ConceptList>
   <Concept PreferredConceptYN="Y">
    <TermList>
     <Term  ConceptPreferredTermYN="Y"  IsPermutedTermYN="N"  LexicalTag="NON"  PrintFlagYN="Y"  RecordPreferredTermYN="Y">
        <String>abc</String>
     </Term>
     <Term  ConceptPreferredTermYN="N"  IsPermutedTermYN="N"  LexicalTag="NON"  PrintFlagYN="N"  RecordPreferredTermYN="N">
        <String>pqr</String>
     </Term>
     <Term  ConceptPreferredTermYN="N"  IsPermutedTermYN="N"  LexicalTag="NON"  PrintFlagYN="Y"  RecordPreferredTermYN="N">
        <String>xyz</String>
    </Term>
   </TermList>
   </Concept>
  </ConceptList>
 </DescriptorRecord>
 <DescriptorRecord DescriptorClass = "1">
  <DescriptorName>
   <String>Numerics</String>
  </DescriptorName>
  <ConceptList>
   <Concept PreferredConceptYN="Y">
    <TermList>
     <Term  ConceptPreferredTermYN="Y"  IsPermutedTermYN="N"  LexicalTag="NON"  PrintFlagYN="Y"  RecordPreferredTermYN="Y">
        <String>123</String>
     </Term>
     <Term  ConceptPreferredTermYN="N"  IsPermutedTermYN="N"  LexicalTag="NON"  PrintFlagYN="N"  RecordPreferredTermYN="N">
        <String>456</String>
     </Term>
     <Term  ConceptPreferredTermYN="N"  IsPermutedTermYN="N"  LexicalTag="NON"  PrintFlagYN="Y"  RecordPreferredTermYN="N">
        <String>789</String>
    </Term>
   </TermList>
   </Concept>
  </ConceptList>
 </DescriptorRecord>
 </root>'

编辑:试图降低计算成本。

谢谢您的建议。我用XPath得到了我的解决方案,但我用了不同的方法。从OPENXML(@hDoc,'root/DescriptorRecord/ConceptList/Concept/TermList/Term')中选择描述符、术语和(描述符[varchar](100)//DescriptorName/String',术语[varchar](100)'String')。此解决方案为我提供了预期的结果。我的一个问题是,这只是创建描述符列,但我还需要第二列名为Terms。我怎么能这么做?我不知道你怎么会得不到条件。请参见此查看结果。很抱歉造成混淆。它给了我术语,但我说的是列标题。这个例子有非常小的数据,但实际上我有一个300 MB的XML文件,采用这种格式。有没有更快的方法得到结果?目前我正在运行这个解决方案,它在过去53分钟内只给了我190条记录,但它仍然在运行!!!!!300MB是一个很大的数目,但现在应该完成了。试试我的编辑,如果它仍然不是非常快,那么我建议将导入放在一个表中并利用它。
DECLARE @X XML =  N'<root>
<DescriptorRecord DescriptorClass = "1">
  <DescriptorName>
   <String>abc</String>
  </DescriptorName>
  <ConceptList>
   <Concept PreferredConceptYN="Y">
    <TermList>
     <Term  ConceptPreferredTermYN="Y"  IsPermutedTermYN="N"  LexicalTag="NON"  PrintFlagYN="Y"  RecordPreferredTermYN="Y">
        <String>abc</String>
     </Term>
     <Term  ConceptPreferredTermYN="N"  IsPermutedTermYN="N"  LexicalTag="NON"  PrintFlagYN="N"  RecordPreferredTermYN="N">
        <String>pqr</String>
     </Term>
     <Term  ConceptPreferredTermYN="N"  IsPermutedTermYN="N"  LexicalTag="NON"  PrintFlagYN="Y"  RecordPreferredTermYN="N">
        <String>xyz</String>
    </Term>
   </TermList>
   </Concept>
  </ConceptList>
 </DescriptorRecord>
 <DescriptorRecord DescriptorClass = "1">
  <DescriptorName>
   <String>Numerics</String>
  </DescriptorName>
  <ConceptList>
   <Concept PreferredConceptYN="Y">
    <TermList>
     <Term  ConceptPreferredTermYN="Y"  IsPermutedTermYN="N"  LexicalTag="NON"  PrintFlagYN="Y"  RecordPreferredTermYN="Y">
        <String>123</String>
     </Term>
     <Term  ConceptPreferredTermYN="N"  IsPermutedTermYN="N"  LexicalTag="NON"  PrintFlagYN="N"  RecordPreferredTermYN="N">
        <String>456</String>
     </Term>
     <Term  ConceptPreferredTermYN="N"  IsPermutedTermYN="N"  LexicalTag="NON"  PrintFlagYN="Y"  RecordPreferredTermYN="N">
        <String>789</String>
    </Term>
   </TermList>
   </Concept>
  </ConceptList>
 </DescriptorRecord>
 </root>'
SELECT Descriptor.Data.value('./DescriptorName[1]/String[1]','nvarchar(200)') AS Descriptor, Terms.Data.value('.','nvarchar(200)') AS Terms
FROM @x.nodes('root/DescriptorRecord') Descriptor(Data)
    cross apply Descriptor.Data.nodes('./ConceptList/Concept/TermList/Term/String') Terms(Data)