Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用XML将关系数据导入SQL Server_Sql Server_Sql Server 2012 - Fatal编程技术网

Sql server 使用XML将关系数据导入SQL Server

Sql server 使用XML将关系数据导入SQL Server,sql-server,sql-server-2012,Sql Server,Sql Server 2012,我使用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 @tb

我使用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>'
DECLARE@tbl_生成表(ID int-IDENTITY(1,1),makeName-nvarchar(100))
在@tbl_makes(makeName)值('Ford')中插入
插入@tbl_品牌(品牌名称)值(“捷豹”)
DECLARE@tbl_models表(ID int IDENTITY(1,1),makeID int,modelName nvarchar(100))
在@tbl_模型(makeID,modelName)值中插入(1,'Escort')
插入@tbl_模型(makeID,modelName)值(1,“Sierra”)
插入@tbl_模型(makeID,modelName)值(2,'XK')
插入@tbl_模型(makeID,modelName)值(2,'XJS')
选择*FROM@tbl\u makes m internal JOIN@tbl\u models md ON m.ID=md.makeID
声明@xml=
'

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

这样的解决方案呢

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;

哇!极好的回答。你能解释一下交叉申请部分吗?是不是因为不能左键连接到XML对象值?另外,外部应用是否会对逻辑产生任何影响?交叉应用和节点()有助于从XML文档创建一个类似于表的实体。XPath表达式返回一些元素,每个元素都与一行相关联。只有在汽车制造商没有提及任何汽车的情况下,您才可能需要外部应用。