Использование SQL Server 2008-индексирование XML SQL Server XQuery
У меня есть данные XML, хранящиеся в столбце моей таблице, которая является результатом экспорта какой-то рисунок информации:
<layout>
<config>
<graphic_type>Box</graphic_type>
<data_access>
</data_access>
<data>
<dimension x="1" y="2" z="3" />
<curve_info ir="-1.5" or="1.5" degree="0"/>
<position x="4" y="5" z="6" />
<rotation x="7" y="8" z="9" />
<color>FFD3D3D3</color>
<is_position_relative>false</is_position_relative>
</data>
</config>
<config>
...
</config>
</layout>
Когда число в нарисовать отдельные части неизвестно. В настоящее время, если я хотел сделать что-то вроде переместить весь рисунок 100 единиц вдоль оси Х, У меня есть SQL-код, как:
SET @xTrans = 100
UPDATE TableName
SET xmlColumn.modify('replace value of (//data/position/@x)[1] with sql:variable("@xTrans")')
SET xmlColumn.modify('replace value of (//data/position/@x)[2] with sql:variable("@xTrans")')
SET xmlColumn.modify('replace value of (//data/position/@x)[3] with sql:variable("@xTrans")')
...
SET xmlColumn.modify('replace value of (//data/position/@x)[20] with sql:variable("@xTrans")')
И я по существу сделать это произвольное число раз, потому что я не знаю сколько узлов фактически существует в каждом чертеже. Я довольно новичок в SQL, а тем более в XQuery, но есть ли лучший способ решить эту проблему?
Чтобы быть более расширяемым, следующая проблема, с которой я сталкиваюсь, заключается в том, что Устройства нарисованы поверх этой модели, они были первоначально нарисованы в 2d перед экспортом в xml-файлы, и поэтому они принимают значение высоты (например, ось Y в моем случае) первой части чертежа, когда координаты устройств X и Z потенциально размещают ее в конце всего чертежа. Это приводит к тому, что некоторые устройства плавают либо выше, либо ниже моделей. Единственное, что я мог думать, чтобы написать для этой проблемы является что-то вроде:
-- Determine if moving along X or Z axis by Y rotation
-- If its the Z-axis, find the range that section covers with position+dimension
-- @range = (///position/@z)[1] + (///dimension/@z)[1]
-- See if the device falls in that range
-- If (///position/@z)[1] < device position @z < @range
-- Then we need the rotation of that box in the Z-axis
-- to calculate the height change for the device
Но это будет связано с того, чтобы скопировать и вставить этот код ~ 15 раз (я не уверен, что наибольшее количество компонентов модельной мог бы иметь, я видел 6 по текущему проекту) и изменяя индекс [1], который кажется крайне неэффективным.
XML-макет устройства точно такой же, как и у модели, только для другого значения.