2009-10-20 2 views
2

В настоящее время у меня есть следующий код кода SQL 2005. Мне нужно импортировать XML как массовую операцию, однако для каждой записи мне может понадобиться дополнительная обработка (возможно, вставка в отдельную таблицу). На данный момент я могу только запросить первый элемент, как я могу запросить полные данные в стиле курсора, где я просматриваю каждый DTO?SQL Server, запрашивающий xml с помощью курсора

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-данные в таблицы temp и следовать с серией операций на них.

+0

Верно, на что мы должны обратить внимание. На данный момент я просто хочу получить логику из C# и в БД, где она принадлежит –

Смежные вопросы