2012-06-28 3 views
7

현재 XML이라는 이름의 XML 열을 저장이라는 테이블에 data라는 XML 형식으로 저장하는 코드가 있습니다.테이블 열에서 SQL Server보기로 XML 파쇄

CREATE TABLE Storage 
(
    ID INT IDENTITY(1,1) PRIMARY KEY, 
    data XML NOT NULL 
) 

GO 

INSERT INTO Storage(data) 
VALUES('<footballteams> 
    <team manager="Benitez">  
     <name>Liverpool</name>  
     <ground>Anfield</ground> 
    </team> 
    <team manager="Mourinho">  
     <name>Chelsea</name>  
     <ground>Stamford Bridge</ground> 
    </team> 
    <team manager="Wenger">  
     <name>Arsenal</name>  
     <ground>Highbury</ground> 
    </team> 
</footballteams>'); 

내가 형태로 데이터 및 디스플레이를 갈가리 찢는 축구보기라는보기를 만들 싶습니다 FootballView (TeamName, 관리자, 그라운드).

.nodes() 메소드를 사용하여 이전의 테이블 열을 사용하여 전체 문서를 잘랐지 만보기를 만들 때 (보기를 사용하는 이유가 있음) 어려워 보입니다. 문제는 이전에 방금 XML을 xml = 'xmlcontent'로 DECLARE 한 변수 @input에 .nodes를 호출했으나 뷰를 사용할 수 없으며 Storage 테이블 열에 포함 된 XML을 구문 분석하려고합니다.

아이디어가 있으십니까? 미리 감사드립니다.

편집 :

SELECT  
     TeamName = Foot.value('(name)[1]', 'varchar(100)'),  
     Manager = Foot.value('(@manager)', 'varchar(100)'),  
     Ground = Foot.value('(ground)[1]', 'varchar(100)') 
FROM  
     @input.nodes('/footballteams/team') AS Tbl(Foot) 

EDIT2 : 나는 테이블로 파쇄 한 경우

가 이전에,이 내가 사용하는 코드 것 이것은 내가 기대하는 출력됩니다.

Expected Output

+0

분쇄에 사용 된 코드를 열에 게시 할 수 있으며 코드를 변환하려고 시도한 방법을 게시 할 수 있습니까? –

+1

위의 편집을 참조하십시오. – themenace92

+0

예상되는 출력은 무엇입니까? – Kane

답변

11

당신은 CROSS APPLY

SELECT  
     TeamName = Foot.value('(name)[1]', 'varchar(100)'),  
     Manager = Foot.value('(@manager)', 'varchar(100)'),  
     Ground = Foot.value('(ground)[1]', 'varchar(100)') 
FROM  
    Storage S 
     CROSS APPLY data.nodes('/footballteams/team') AS Tbl(Foot) 

CROSS APPLYOUTER APPLY가 효과적으로 현재의 데이터 세트에 XML의 컬렉션에 가입 할 수 있도록 사용해야합니다.

+0

그것은 작동합니다! 대단히 감사합니다. D – themenace92

+0

내 기쁨! 도와 줄 수있어서 기뻐! –

+0

나는 바깥 쪽이 NULLs도 포함한다는 cross와 outer의 차이점을 물어볼 수 있습니까? – themenace92