2013-09-25 2 views
2

저는 XML을 사용하여 대량의 데이터를 잠시 동안 SQL로 가져 왔습니다.하지만 여러 XML 파일에서 여러 테이블로 데이터를 가져올 수 있는지 궁금합니다. 자식 노드? 이 예제를 감안할 때XML을 사용하여 SQL Server로 관계형 데이터 가져 오기

는 :

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>' 

나는 메이크업 이름이 먼저 관련 데이터가 삽입되기 전에/삽입 보았다 업 될 필요가 있음을 주셔서 감사합니다. 나는 이것에 대한 답변을 온라인에서 찾았지만 예제는 하나의 테이블만을 사용한다. 나는 다양한 임시 테이블을 사용하지 않으면 불가능하다고 생각하지만, 여기에 간다 ...

답변

6

그런 해결책은 어떨까요?

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; 
+0

와우. 최고의 대답. CROSS APPLY 부분에 대해 설명해 주시겠습니까? LEFT JOIN을 XML 객체 값으로 가져올 수 없기 때문입니까? 또한, OUTER가 적용되면 논리에 어떤 차이가 있습니까? – EvilDr

+1

CROSS APPLY 및 nodes()는 XML 문서에서 테이블과 유사한 엔티티를 만드는 데 도움이됩니다. XPath 표현식은 일부 요소를 반환하고 모든 단일 요소는 단일 행과 연결됩니다. 언급 된 자동차가없는 자동차 제조업체가있을 수있는 경우에만 외장이 필요할 수 있습니다. – GriGrim

+0

우수, 다시 한번 감사드립니다. – EvilDr

관련 문제