Запрос 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
обновление 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