将XML导入SQL Server

时间:2018-11-28 20:13:26

标签: sql sql-server xml

我想知道如何将XML文件插入SQL Server DB。以下是我拥有的XML,但是我不确定如何以可扩展的方式进行此操作。我的想法是在Insert Into Select语句中,但是我不知道随着数据的增加它是否会起作用。预先谢谢你!

<Records>
    <Record>
        <ID SpecNum="5069580" IssueNum="001" SpecStatus="Pre-Approved">
            <NutritionDetails>
                <NutrientFacts>
                    <NutrientNameId>ENERC_KCAL</NutrientNameId>
                    <NutrientName>ENERC_KCAL</NutrientName>  
                    <NutrientPer100gUnrounded>1.91</NutrientPer100gUnrounded>
                    <NutrientPer100gRounded>191</NutrientPer100gRounded>
                </NutrientFacts>
            </NutritionDetails>
        </ID>
    </Record>
</Records>

1 个答案:

答案 0 :(得分:0)

成功创建了正确的有效XML之后,您应该可以使用以下T-SQL代码获取详细信息:

SELECT
    -- get the attributes from the <ID> node
    IDSpecNum = XC.value('(ID/@SpecNum)[1]', 'int'),
    IDIsseNum = XC.value('(ID/@IssueNum)[1]', 'int'),
    IDSpecStatus = XC.value('(ID/@SpecStatus)[1]', 'varchar(100)'),
    -- get the element values from the children of the <NutrientFacts> node
    NutrientNameId = NUT.value('(NutrientNameId)[1]', 'varchar(100)'),
    NutrientName = NUT.value('(NutrientName)[1]', 'varchar(100)'),
    NutrientPer100gUnrounded = NUT.value('(NutrientPer100gUnrounded)[1]', 'decimal(20,4)'),
    NutrientPer100gRounded = NUT.value('(NutrientPer100gRounded)[1]', 'decimal(20,4)')
FROM
    dbo.YourTable
CROSS APPLY
    -- get one XML fragment per <Record>
    XmlData.nodes('/Records/Record') AS XT(XC)
CROSS APPLY
    -- get one XML fragment per <NutrientFacts> inside
    XC.nodes('ID/NutritionDetails/NutrientFacts') AS XT2(NUT)

第一个CROSS APPLY基本上会获得一个“内联伪表”,其中在表的<Record>列中XML中的每个XmlData节点都有一个XML片段(这只是一个<我坚强的假设-适应您的现实!)。这些XML片段被称为“伪表” XT,其中只有一列XC

有了该XC列的XML片段,您可以从<ID>的{​​{1}}节点“进入”并获取属性值-这是前三个值。

然后,基于<Record>伪表,我应用另一个XT来获取CROSS APPLY内的所有<NutrientFacts>节点-这些节点被称为伪表{{ 1}}和列<ID> / <NutritionDetails>,该列又为每个XT2节点保存一个XML片段;我进入该XML节点,并从该节点的子元素中提取值-这些是select中显示的四个附加值。

现在,您拥有一个返回所有值的NUT-您可以轻松获取所需的位并将其用于<NutrientFacts>方案中。享受吧!

更新:将XML文件从磁盘( SQL Server 计算机的文件系统上的本地磁盘)导入表中-使用类似这样的东西:

SELECT

再次:适应您的需求-我不知道您是否要在INSERT INTO dbo.MyTable(list-of-columns) SELECT list-of-columns :......中插入其他信息-我什至都不知道您的表名;您可以一次从磁盘加载一个XML