2015-04-23 4 views
1

Использование 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-макет устройства точно такой же, как и у модели, только для другого значения.

ответ

1

Невозможно заменить сразу несколько значений в xml в SQL Server, есть several options. В вашем случае я бы предложил использовать простой цикл:

select @i = max(t.xmlColumn.value('count(//data/position[@x != 100])', 'int')) 
from TableName as t 

while @i > 0 
begin 
    update TableName set 
     xmlColumn.modify(' 
      replace value of (//data/position[@x != 100])[1]/@x 
      with sql:variable("@xTrans")' 
     ) 

    set @i = @i - 1 
end 
Смежные вопросы