【问题标题】:Importing relational data into SQL Server using XML使用 XML 将关系数据导入 SQL Server
【发布时间】:2013-09-25 20:17:38
【问题描述】:

一段时间以来,我一直在使用 XML 将大量数据导入 SQL,但我想知道是否可以从具有子节点的单个 XML 文件跨多个表导入数据?

举个例子:

DECLARE @tbl_makes TABLE (ID int IDENTITY(1,1), makeName nvarchar(100))
INSERT INTO @tbl_makes (makeName) VALUES ('Ford') 
INSERT INTO @tbl_makes (makeName) VALUES ('Jaguar') 

DECLARE @tbl_models TABLE (ID int IDENTITY(1,1), makeID int, modelName nvarchar(100))
INSERT INTO @tbl_models (makeID, modelName) VALUES (1, 'Escort')
INSERT INTO @tbl_models (makeID, modelName) VALUES (1, 'Sierra')
INSERT INTO @tbl_models (makeID, modelName) VALUES (2, 'XK')
INSERT INTO @tbl_models (makeID, modelName) VALUES (2, 'XJS')

SELECT * FROM @tbl_makes m INNER JOIN @tbl_models md ON m.ID = md.makeID 

DECLARE @xml XML = '
<cars>
    <make name="Ford">
        <model name="Mustang" />
        <model name="Taurus" />
        <model name="F350" />
    </make>
    <make name="Aston Martin">
        <model name="Vanquish" />
        <model name="DB7" />
        <model name="Lagonda" />
    </make>
</cars>'

我知道在插入相关数据之前需要先插入/查找品牌名称。我在网上搜索了这个问题的答案,但示例只使用一个表。我猜如果不使用各种临时表是不可能的,但是这里......

【问题讨论】:

    标签: sql-server sql-server-2012


    【解决方案1】:

    这样的解决方案呢?

    INSERT INTO @tbl_makes (makeName)
    SELECT i.i.value('@name', 'nvarchar(100)')
    FROM @xml.nodes('/cars[1]/make')i(i)
    LEFT JOIN @tbl_makes MA on i.i.value('@name', 'nvarchar(100)') = MA.makeName
    WHERE MA.ID IS NULL;
    
    INSERT INTO @tbl_models (makeID, modelName)
    SELECT MA.ID, j.j.value('@name', 'nvarchar(100)')
    FROM @xml.nodes('/cars[1]/make')i(i)
    INNER JOIN @tbl_makes MA ON i.i.value('@name', 'nvarchar(100)') = MA.makeName
    CROSS APPLY i.i.nodes('model')j(j)
    LEFT JOIN @tbl_models MO on j.j.value('@name', 'nvarchar(100)') = MO.modelName
    WHERE MO.ID IS NULL;
    

    【讨论】:

    • 哇。绝妙的答案。你能解释一下 CROSS APPLY 部分吗?是因为您不能 LEFT JOIN 到 XML 对象值吗?另外,OUTER APPLY 对逻辑有什么影响吗?
    • CROSS APPLY 和 nodes() 有助于从 XML 文档创建一个类似表格的实体。 XPath 表达式返回一些元素,每个元素都与单行相关联。仅当存在未提及任何汽车的汽车制造商时,您才可能需要 OUTER APPLY。
    猜你喜欢
    • 1970-01-01
    • 2012-06-26
    • 2011-09-06
    • 2013-09-08
    • 2016-10-29
    • 1970-01-01
    • 2013-05-26
    • 2023-03-16
    相关资源
    最近更新 更多