Как обновить определенные атрибуты XML в SQL Server?

50
6

Мы храним XML-документ обо всех различных расходах в SQL Server 2008 r2. Теперь некоторые цены должны обновляться на основе формулы.

Один из подходов к этому был бы:

Уничтожьте XML и получите доступ к значениям. Сделайте расчет Теперь перестроим структуру XML.

Это единственный способ сделать это? Или есть более простой способ, когда мы можем получить доступ к значениям "на лету" и обновить весь XML за один раз? Для такого рода сценариев, какой подход лучше всего подходит?

Вот пример XML:

<ItemAttributeData>
<Section ID="469919" TypeID="61000002">
<Attributes>
<Attribute ID="3870" UniqueID="1c71212b-8395-4b43-a44d-9a63374c8c99" VALUE="2" />
<Attribute ID="3569" UniqueID="c0b754d3-e03e-4d4a-9bc1-dcb11c04535b" VALUE="2" />
<Attribute ID="1592" UniqueID="2609b344-88b2-44d6-be20-07b634705c30" VALUE="2" />
</Attributes>
</Section>
<Section ID="469920" TypeID="61000001">
<Attributes>
<Attribute ID="3702" UniqueID="7cabf9e8-4f60-4e1e-afe5-75b153e8c5eb" VALUE="1000001649" />
<Attribute ID="3870" UniqueID="595f8e2c-bccb-4fcb-81d4-303fcb7d44c4" VALUE="2" />
<Attribute ID="3868" UniqueID="2226f6c6-380a-4195-98f7-c6deec84e4e8" VALUE="2" />
<Attribute ID="3754" UniqueID="bf936c3f-fa96-49b9-8a62-46fb7e0009d5" VALUE="1000001600" />
<Attribute ID="2204" UniqueID="bdc78784-86ad-4567-bc06-40896d603eaf" VALUE="1" />
<Attribute ID="3874" UniqueID="8728249f-5e60-4938-a60d-208426fe11c8" VALUE="1" />
</Attributes>
</Section>
<Section ID="469921" TypeID="61000001" />
</ItemAttributeData>

спросил(а) 2013-06-26T00:04:00+04:00 6 лет, 8 месяцев назад
1
Решение
61

Вы можете использовать нестандартное replace value of команды обновления XML. подобно

DECLARE @myDoc xml
SET @myDoc = '<Root>
<Location LocationID="10"
LaborHours=".1"
MachineHours=".2" >Manu steps are described here.
<step>Manufacturing step 1 at this work center</step>
<step>Manufacturing step 2 at this work center</step>
</Location>
</Root>'
--SELECT @myDoc

SET @myDoc.modify('
replace value of (/Root/Location[1]/@LaborHours)[1]
with (
if (count(/Root/Location[1]/step) > 3) then
"3.0"
else
"1.0"
)
')
SELECT @myDoc

ответил(а) 2013-06-26T11:20:00+04:00 6 лет, 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема