2009-10-01 2 views
0

SQL에서 XML로 많은 작업을하지 않았으므로 최선을 다해 질문 할 것입니다.XML 삽입물에서 개별 신원을 얻는 방법?

삽입 용 SQL에서 구조화 된 XML을 수신한다고 가정 해 봅시다.

구조는 다음과 같을 수 있습니다

나는이 경우에 나는 단지 한 기록 및 접근 SCOPE_IDENTITY을 (이 있기 때문에, 신원을 -Team- 레코드를 삽입하고 얻을 수 있어요
<Team> 
    <Player> 
    <Name>Player1</Name> 
    <Games> 
     <Game> 
     <Date>9/7/2009</Date> 
     <MinutesPlayed>90</MinutesPlayed> 
     </Game> 
    </Games> 
    </Player> 
    <Player> 
    <Name>Player2</Name> 
    <Games> 
     <Game> 
     <Date>9/7/2008</Date> 
     <MinutesPlayed>87</MinutesPlayed> 
     </Game> 
    </Games> 
    </Player> 
</Team> 

는)에 대한 정체성을 일치합니다 그 레코드, 그리고 Player 노드를 삽입 할 때 사용하는 ID.

게임 테이블에 PlayerID 필드가 있습니다. 삽입 된 각 플레이어의 신원을 확인한 다음 해당 신원을 사용하여 게임 기록을 삽입하려면 어떻게해야합니까?

@Select FROM @ ReceivedXML.nodes ('Player')와 같은 SELECT를 수행하면 여러 값이 반환되므로 모든 플레이어 노드가 일괄 적으로 삽입됩니다.

아무에게도이 작업을 수행하는 방법에 대한 가이드 나 나에게이 문제를 어떻게 해결했는지 공유 할 수 있습니까? 고마워, 정말 고마워.


편집 - 어쩌면 정확하게 설명하지 못했습니다.

팀에 TeamID 필드가 있습니다. 플레이어에는 TeamID 필드와 마찬가지로 PlayerID 필드가 있습니다. 게임에는 GameID 및 PlayerID 필드가 있습니다.

XML에서 팀을 새로 추가하고 팀 ID를 새로 생성 한 다음 플레이어 1을 PLayers 테이블에 삽입하고 새로 생성 된 PlayerID ID를 가져온 다음 이전에 획득 한 PLayerID를 사용하여 게임 레코드를 삽입하는 방법에 대해 설명합니다.

Player1을 끝내고 나면 Player2에서도 동일한 작업을 수행합니다. 플레이어 기록을 넣고 신분을 PlayerID < 삽입 게임 등

+0

이렇게하려면, 당신은 아마 최고야 게임 등으로 다음 삽입의 ID를 얻기 위해 이름을 플레이어 테이블과 구문 분석 된 XML에 가입 - 당신로 말하자면, 플레이어 전체를 넣을 수 있으며, 차례로 각 플레이어를위한 수많은 게임을 삽입 할 수 있습니다. 이것은 루프에서 수행하는 것이 가장 좋습니다. T-SQL이 확실하게 빛을 발하지 않는 영역입니다. –

답변

1

다음과 같이 플레이어 테이블을로드하십시오.

그런 다음, C#으로 그것을 달성하기 위해 노력하고 떨어져

DECLARE @foo XML 

SELECT @foo = N' 
<Team> 
    <Player> 
    <Name>Player1</Name> 
    <Games> 
     <Game> 
     <Date>9/7/2009</Date> 
     <MinutesPlayed>90</MinutesPlayed> 
     </Game> 
    </Games> 
    </Player> 
    <Player> 
    <Name>Player2</Name> 
    <Games> 
     <Game> 
     <Date>9/7/2008</Date> 
     <MinutesPlayed>87</MinutesPlayed> 
     </Game> 
    </Games> 
    </Player> 
</Team> 
' 


INSERT Players 
    (PlayerName) 
SELECT 
    CAST(y.item.query('data(Name)') AS varchar(30)) 
FROM 
    @foo.nodes('/Team') x(item) 
    CROSS APPLY 
    x.item.nodes('./Player') AS y(item) 


INSERT Game 
    (PlayerID, Date, MinutesPlayed) 
SELECT 
    P.PlayerID, 
    CAST(z.item.query('data(Date)') AS varchar(30)), 
    CAST(z.item.query('data(MinutesPlayed)') AS varchar(30)) 
FROM 
    @foo.nodes('/Team') x(item) 
    CROSS APPLY 
    x.item.nodes('./Player') AS y(item) 
    CROSS APPLY 
    y.item.nodes('./Games/Game') AS z(item) 
    JOIN 
    Players P ON CAST(y.item.query('data(Name)') AS varchar(30)) = P.PlayerName 
+0

감사합니다. gbn,하지만 필요한 작업을하지 못했습니다. 기본적으로 나는 각 플레이어를 개별적으로 삽입하고 삽입 된 플레이어의 ID를 사용하여 하위 레코드 (게임 등)를 삽입 할 수 있도록 FOR EACH 루프를 찾고 있었다고 생각합니다. 위에서 쓴 쿼리는 모든 행의 데이터를 하나의 행으로 제공합니다. 각 행에 각 테이블에 해당하는 필드의 이름을 알기 위해 사용할 수 있다고 생각합니다. 그러나 각 루프 접근 방식을 더 원했습니다. 노력에 감사드립니다. – GR7

+0

원하는 경우 루프로 쓸 수 있지만 내 의견을 읽지는 않았습니다. Players *를로드 한 다음 *에 다시 가입하여 게임을로드하기 위해 이름과 일치하는 삽입 된 ID를 가져와야합니다. 또는 모든 데이터가 포함 된 임시 테이블을로드하고 그 테이블에 다시 조인 할 수 있습니다. – gbn

+0

... 업데이트 된 코드 – gbn

관련 문제