2012-05-10 2 views
1

I I 데이터베이스에 삽입 할 다음 XML을 나는 다음과 같은 SQLSQL, XML 삽입 여러 노드

INSERT INTO test (startLocation,endLocation,mon,tue) 
SELECT 
X.product.query('startLocation').value('.', 'VARCHAR(255)'), 
X.product.query('endLocation').value('.', 'VARCHAR(255)'), 
X.product.query('Mon').value('.', 'VARCHAR(255)'), 
X.product.query('Tue').value('.', 'VARCHAR(255)') 
FROM (
SELECT CAST(x AS XML) 
FROM OPENROWSET(
BULK '#fileLocation#', 
SINGLE_BLOB) AS T(x) 
) AS T(x) 
CROSS APPLY x.nodes('latestjourneys/journey') AS X(product) 

이 코드를 사용하는 경우에만 startLocation을 사용하고

<latestjourneys> 
    <journey> 
     <startLocation>London</startLocation> 
     <endLocation>manchester</endLocation> 
     <leavingDay> 
      <mon>Yes</mon> 
      <tue>No</tue> 
     </leavingday> 
    <journey> 
    <journey> 
     <startLocation>Liverpool</startLocation> 
     <endLocation>Cardiff</endLocation> 
     <leavingDay> 
      <mon>Yes</mon> 
      <tue>No</tue> 
     </leavingday> 
    <journey> 
</latestjourneys> 

endLocation이 삽입됩니다. CROSS APPLY를 변경하면

CROSS APPLY x.nodes('latestjourneys/journey/leavingDay') AS X(product) 

일만 삽입됩니다.

두 가지 데이터를 삽입 할 수있는 방법은 무엇입니까?

+0

** ** 데이터베이스 시스템 및 버전은 무엇입니까 ?? ** SQL **은 많은 데이터베이스 시스템에서 사용되는 언어 인 구조화 된 쿼리 언어입니다 - SQL은 ** 데이터베이스 제품이 아닙니다 ** XML 지원과 같은 기능은 벤더마다 다릅니다 - 그래서 우리는 무엇을 알아야합니까? .... –

+0

또한 XML이 유효하지 않습니다 - ''의 닫는 태그는 ''(대소 문자가 중요!)이어야하고 ''노드는 전혀 닫혀 있지 않아야합니다. 그들의 "닫는"꼬리표는''다시 - 작동하지 않는다 ... –

답변

1

당신은 SQL 서버 2005 이상 사용하는 경우 -이 같은 것을 사용할 수 있습니다

SELECT 
    StartLocation = Journey.value('(startLocation)[1]', 'varchar(50)'), 
    EndLocation = Journey.value('(endLocation)[1]', 'varchar(50)'), 
    LeaveMon = Leaving.value('(mon)[1]', 'varchar(10)'), 
    LeaveTue = Leaving.value('(tue)[1]', 'varchar(10)') 
FROM 
    X.nodes('/latestjourneys/journey') AS Nodes(Journey) 
CROSS APPLY 
    Journey.nodes('leavingDay') AS Subnode(Leaving) 

기본적으로, 첫 번째 .nodes() 전화 당신의 목록을 제공 모든 <journey> 요소 - 그런 다음 각 요소에서 을 다시 호출하여 <leavingDay> 하위 노드의 모든 요소를 ​​가져와야합니다.

+1

이것은 진짜로 저를 도왔다. 고마워. –

-1

은 흠 .. 나는 값 기능이 어쩌면 XPath 식을 사용하여 같은 일을 노드의 값을 반환합니다 생각 : 나는 SQL의 XML 지원을 정말 잘 알고 아니에요

X.product.value('/latestjourneys/journey/leavingDay') 

을하지만 난 희망 이것은 도움이됩니다.

또한 확인할 수 있습니다 http://msdn.microsoft.com/en-us/library/ms345117%28v=sql.90%29.aspx

0

선언 @temp 테이블 (INT 번호, 고유 식별자 GUID)

XML로 @XMlData 선언;

세트 @XMlData = @temp에

삽입 '여기 XML을 붙여'(ID, GUID) XTbl.Cats.value을 선택 ('.', 'INT') @XMlData에서 NEWID().

아이디 GUID 10 12FF8543-D98C-4CF3-BA0B-CD4CFEF5A0C3 F6244519- 20 : 노드 ('/ 사용자/사용자) XTbl (고양이) AS 선택

* @temp

출력으로부터 F40E-4E28-9C91-5832E7F45A70 30 6775BED5-1127-4D 8E-88D2-ECE9CED55056