2011-12-08 78 views
1

选择XML领域的具体数值我有一个表XML列,我想解析XML和值插入到新表如何在SQL Server 2008

如何将XML值插入到表?

CREATE TABLE [dbo].[PubmedMeshDescriptors](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [PMID] [int] NULL, 
    [Descriptor] [nvarchar](400) NULL, 
    [DescriptorIsMajor] [char](1) NULL, 
    [Qualifier] [nvarchar](400) NULL, 
    [QualifierIsMajor] [char](1) NULL 
) 

,并在另一个表中的XML列看起来像这样

<MedlineCitation Owner="NLM" Status="MEDLINE"> 
    <PMID Version="1">1</PMID> 
    <MeshHeadingList> 
    <MeshHeading> 
     <DescriptorName MajorTopicYN="N">Aldehyde Oxidoreductases</DescriptorName> 
     <QualifierName MajorTopicYN="N">metabolism</QualifierName> 
    </MeshHeading> 
    <MeshHeading> 
     <DescriptorName MajorTopicYN="N">Animals</DescriptorName> 
    </MeshHeading> 
    <MeshHeading> 
     <DescriptorName MajorTopicYN="N">Carbon Dioxide</DescriptorName> 
     <QualifierName MajorTopicYN="N">blood</QualifierName> 
    </MeshHeading> 
    <MeshHeading> 
     <DescriptorName MajorTopicYN="N">Formates</DescriptorName> 
     <QualifierName MajorTopicYN="N">blood</QualifierName> 
     <QualifierName MajorTopicYN="Y">poisoning</QualifierName> 
    </MeshHeading> 
    <MeshHeading> 
     <DescriptorName MajorTopicYN="N">Haplorhini</DescriptorName> 
    </MeshHeading> 
    <MeshHeading> 
     <DescriptorName MajorTopicYN="N">Hydrogen-Ion Concentration</DescriptorName> 
    </MeshHeading> 
    <MeshHeading> 
     <DescriptorName MajorTopicYN="N">Methanol</DescriptorName> 
     <QualifierName MajorTopicYN="N">blood</QualifierName> 
    </MeshHeading> 
    <MeshHeading> 
     <DescriptorName MajorTopicYN="N">Methods</DescriptorName> 
    </MeshHeading> 
    <MeshHeading> 
     <DescriptorName MajorTopicYN="N">Pseudomonas</DescriptorName> 
     <QualifierName MajorTopicYN="N">enzymology</QualifierName> 
    </MeshHeading> 
    </MeshHeadingList> 
</MedlineCitation> 

我怎么能做到这一点使用SQL查询?

回答

2

的把XML转换为XML变量,并尝试这样的事:

INSERT PubmedMeshDescriptors (PMID, Descriptor, DescriptorIsMajor, Qualifier, QualifierIsMajor) 
SELECT 
    PMIDNode.value('.', 'int') as PMID, 
    DescriptorNode.value('.', 'nvarchar(400)') as Descriptor, 
    DescriptorNode.value('(./@MajorTopicYN)[1]', 'char(1)') as DescriptorIsMajor, 
    QualifierNode.value('.', 'nvarchar(400)') as Qualifier, 
    QualifierNode.value('(./@MajorTopicYN)[1]', 'char(1)') as QualifierIsMajor 
FROM @xml.nodes('/MedlineCitation') AS citation(citationNode) 
CROSS APPLY 
    citationNode.nodes('./PMID') 
    AS PMID(PMIDNode) 
CROSS APPLY 
    citationNode.nodes('./MeshHeadingList/MeshHeading') 
    AS MeshHeading(MeshHeadingNode) 
OUTER APPLY 
    MeshHeadingNode.nodes('./DescriptorName') 
    AS Descriptor(DescriptorNode) 
OUTER APPLY 
    MeshHeadingNode.nodes('./QualifierName') 
    AS Qualifier(QualifierNode)