2013-07-25 52 views
1

我有這樣一個表這個更新表中的一列反覆

CREATE TABLE #tmp(ColSelect NVARCHAR(400),ColParValues XML) 

ColSelect包含SQL SELECT語句並ColParValues包含例如ColSelectcontains在ColSelect 參數值某些XML數據:

"SELECT [$12]+19/[$16]-[$54]" 

和第2列包含指向ColSelect參數的名稱值對

如何更新我的表格,用ColParValues中的相關值替換每個參數。我使用這個語句:

update #tmp 
SET 
ColSelect=REPLACE(ColSelect,c.value('@Value','nvarchar(10)'),c.value('@Res','DECIMAL(24,12)')) 
FROM #tmp t1 
    CROSS APPLY t1.ColParValues.nodes('/root/r') AS n(c) 

但是這個語句在每一行中只替換一個參數值。 這是樣本數據link

+0

如果您可以提供一些樣本數據,這很好。 – tsohtan

+0

示例數據[鏈接](http://testalims.com/Capture.jpg) – Omital

回答

0

這是一個解決辦法:

create table #tmp (colselect varchar(200),colparvalues xml) 

insert into #tmp (colselect,colparvalues) 
values ('select case when [$71]+[$29]+10<25 then 1 else 0 end' 
     ,'<root><r Value="[$71]" Res="1"/><r Value="[$29]" Res="5"/></root>'), 
('select case when [$95]*[$29]+10<25 then 1 else 0 end' 
     ,'<root><r Value="[$95]" Res="3"/><r Value="[$29]" Res="5"/></root>') 

WHILE @@ROWCOUNT >0 
update #tmp 
SET 
ColSelect=REPLACE(ColSelect,c.value('@Value','nvarchar(10)'),c.value('@Res','DECIMAL(24,12)')) 
FROM #tmp t1 
    CROSS APPLY t1.ColParValues.nodes('/root/r') AS n(c) 
WHERE t1.colselect LIKE'%'+replace(c.value('@Value','nvarchar(10)'),'[','')+'%' 


select * from #tmp 

drop table #tmp 

然而,非常類似於光標的表現。檢查性能。如果可以使用。

+0

感謝您的回覆。我不明白,爲什麼'code' LIKE'%'+ replace(c.value('@ Value','nvarchar(10)'),'[','')+'%' – Omital

+0

@ user2377017:如果不使用它會考慮使用元素'$'和其他整數通過SQL設置模式匹配。例如。 :'select 1 where'a'like'[a..z]'' –

+0

Ddo你相信你的答案,這是最好的方法嗎? – Omital