Запрос SQL Server 2005 для определенных значений XML

Я пытаюсь запросить столбцы XML в SQL Server 2005

У меня действительно длинная строка, которая хранится в столбце, и это XML. Я хочу проверить, установлена ​​ли видимость определенного элемента в true или нет.

Есть идеи, как это сделать?

Я не могу опубликовать строку, содержащую весь XML, потому что этот редактор стека не любит код.

Спасибо

Я приложил картинку, показывающую мое предложение выбора и результаты, из выражений случаев вы можете видеть, что я пытаюсь сделать.

Проблема в том, что в столбце настроек отображается имя столбца, но я хочу посмотреть, отображается ли видимость этого столбца, например (colFirstChoiceVendorPaymentTerms) установлен в true или нет...

2 ответа

Попробуйте этот код:

SELECT 
  CAST(data as XML).exist('//XtraSerializer//property[@name="colFirstChoiceVendorPaymentTerms"]/property[@name=''Visible'' and text()=''true'']') as col1,
  CAST(data as XML).exist('//XtraSerializer//property[@name="colSecondChoiceVendorPaymentTerms"]/property[@name=''Visible'' and text()=''true'']') as col2
  FROM TBL

Ответ на ваш вопрос сильно зависит от используемой вами XML-схемы. Например, если вы используете атрибуты xml следующим образом:

'<Item ID="1" Visibility="1" />'

Вы можете фильтровать элементы с помощью этого запроса:

select *
from temp
where data.exist('Item[@Visibility = "1"]') = 1

Смотрите это на демоверсии sql fiddle

Трудно ответить более точно, пока у нас нет точной схемы вашего xml.


Обновить

Похоже, у вас есть настройки DevExpress, хранящиеся в вашей базе данных. Так что, если ваш упрощенный XML похож на это:

<XtraSerializer version="1.0" application="View">
  <property name="Columns" iskey="true" value="9">
    <property name="colFirstChoiceVendorPaymentTerms" isnull="true" iskey="true">
      <property name="Visible">true</property>
    </property>
    <property name="colSecondChoiceVendorPaymentTerms" isnull="true" iskey="true">
      <property name="Visible">false</property>
    </property>
  </property>
</XtraSerializer>

Затем вы можете запросить это как:

select
data.value('(XtraSerializer/property/property[@name="colFirstChoiceVendorPaymentTerms"]/property[@name="Visible"])[1]', 'bit') as first,

data.value('(XtraSerializer/property/property[@name="colSecondChoiceVendorPaymentTerms"]/property[@name="Visible"])[1]', 'bit') as second
from temp

sql fiddle demo


обновление 2

если ваш тип данных text / varchar, попробуйте это:

select
    c.data_xml.value('(XtraSerializer/property/property[@name="colFirstChoiceVendorPaymentTerms"]/property[@name="Visible"])[1]', 'bit') as first,
    c.data_xml.value('(XtraSerializer/property/property[@name="colSecondChoiceVendorPaymentTerms"]/property[@name="Visible"])[1]', 'bit') as second
from temp as t
    outer apply (select cast(t.data as xml) as data_xml) as c
Другие вопросы по тегам