2009-10-20 3 views
2

현재 SQL 2005 코드 블록은 다음과 같습니다. 내가해야 할 일은 XML을 대량 작업으로 가져 오는 것이다.하지만 각 레코드에 대해 추가 처리 (별도의 테이블에 삽입)해야 할 수도있다. 현재 첫 번째 항목 만 쿼리 할 수있는 반면, 각 DTO를 둘러 보는 커서 스타일의 전체 데이터를 어떻게 쿼리 할 수 ​​있습니까?커서를 사용하여 xml을 쿼리하는 SQL Server

DECLARE @open_xml XML 
SET @open_xml = '<DataDTOs> 
</pre> 
< DataDTO> 
    < UserId>123456789</UserId> 
    < ItemID>0</ItemID> 
    < /DataDTO> 
< DataDTO> 
    < UserId>112456789</UserId> 
    < ItemID>10</ItemID> 
    </ DataDTO> 
< DataDTO> 
    < UserId>123456129</UserId> 
    < ItemID>20</ItemID> 
    </ DataDTO> 
< DataDTO> 
    < UserId>120056789</UserId> 
    < ItemID>444</ItemID> 
    < /DataDTO> 
</ DataDTOs>' 

DECLARE @userid nvarchar(255) 
SELECT @userid = 
    tab.col.value('UserId[1]','VARCHAR(20)') 
FROM @open_xml.nodes('//DataDTO') tab(col) 
select @userid 

-- Do some stuff 

-- Get next UserID 

-- Do some stuff 

위의 사항에 대한 도움이 필요하십니까?

감사

답변

6

아무것도 특별한, 단지 @xml에서 선택을 통해 커서를 선언

DECLARE @userid nvarchar(255); 

DECLARE crsDTO cursor static forward_only read_only for 
SELECT 
    tab.col.value('UserId[1]','VARCHAR(20)') 
FROM @open_xml.nodes('//DataDTO') tab(col) 

open crsDTO; 
fetch next from crsDTO into @userid; 
while 0 = @@fetch_status 
begin 
-- do you work 
fetch next from crsDTO into @userid; 
end 
close crsDTO; 
deallocate crsDTO; 

일반적인 경고는 아마도 당신이 일련의 작업으로 삽입 할 수 있습니다 적용 커서 대신 하나 등 등

3

느린 RBAR ("Row By Agonizing Row") 처리를 피하려면 임시 테이블에 XML 데이터를로드하고 일련의 작업을 설정합니다.

+0

사실, 우리가 살펴 봐야 할 것이 있습니다. 지금은 C#에서 논리를 빼내서 속한 DB로 옮기고 싶습니다. –

관련 문제