2009-10-20 58 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(「行通過Agonizing Row」)處理,您可以將XML數據加載到臨時表中並遵循並對其進行一系列基於集合的操作。

+0

是的,我們應該看看。就目前而言,我只想將邏輯從C#中移出到它所屬的數據庫中 – 2009-10-20 15:48:21