SQL Server使用游标查询xml

时间:2009-10-20 15:20:54

标签: sql-server

我目前有以下SQL 2005代码块。我需要做的是将XML作为批量操作导入,但是对于每个记录,我可能需要进行一些额外的处理(可能插入到单独的表中)。目前我只能查询第一项,如何以每个DTO环顾四周的光标样式查询完整数据?

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

对此的任何帮助都会很棒!

由于

2 个答案:

答案 0 :(得分:7)

没什么特别的,只需在@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;

通常的警告适用,也许您可​​以将插入作为设置操作而不是光标等等。

答案 1 :(得分:3)

为了避免缓慢的RBAR(“通过Agonizing Row行”)处理,您可以将XML数据加载到临时表中,并对它们进行一系列基于集合的操作。