2013-07-25 3 views
1

У меня есть таблица, как этоОбновление столбца в таблице несколько раз

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

что ColSelect содержит SQL Оператор Select и ColParValues ​​ содержит некоторые данные XML для значения параметра в ColSelect Например ColSelectcontains:

"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

Вы доверяете своему ответу, это лучший способ? – Omital

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