2015-01-27 7 views
0

У меня есть следующая таблицаСортировать по значению атрибута XML

EntityID | Data 
-----------+----------- 
1   | <xml data> 
2   | <xml data> 
3   | <xml data> 

Где XML DATA выглядит следующим образом:

<Qualifications> 
    <Qualification QualificationName="Has Dr's degree" Remark="Yes" /> 
    <Qualification QualificationName="ASP.NET Experience" Remark="1 Year" /> 
    <Qualification QualificationName="Sex" Remark="M" /> 
</Qualifications> 

Я хотел бы иметь возможность заказать замечанием для конкретного QualificationName

SELECT * FROM Таблица .... ORDER BY 'ASP.NET Опыт'

P.S. Potencially я могу изменить XML, чтобы что-то вроде этого, чтобы сделать вещи проще

<Qualifications> 
    <Has Dr's degree>Yes</Has Dr's degree> 
    <ASP.NET Experience>1 Year</ASP.NET Experience> 
    <Sex>M</Sex> 
</Qualifications> 

UPD1: Для случая, когда пользователь хочет приказать «ASP.NET Опыт» квалификации Ожидаемый результат будет выглядеть так:

EntityID | Data 
-----------+----------- 
3   | <xml data> 
1   | <xml data> 
2   | <xml data> 

Поскольку EntityId 3 имеет замечание «1 год» EntityId 1 имеет замечание «2 года» и EntityId 2 имеет замечание внутри столбца XML '3 лет за «ASP.NET Опыт» квалификации

+0

Можете ли вы показать ожидаемый результат? – Darka

+0

@ Дарка добавил ожидаемый результат – Anubis

ответ

1

Предполагая, что @QualificationName идентифицирует конкретныйузел, который вы хотите заказать, даст вам значение замечания.

declare @xml xml; set @xml = '<Qualifications> 
    <Qualification QualificationName="Has Dr%quot;s degree" Remark="Yes" /> 
    <Qualification QualificationName="ASP.NET Experience" Remark="1 Year" /> 
    <Qualification QualificationName="Sex" Remark="M" /> 
</Qualifications>' 

declare @Qualification nvarchar(100); set @Qualification = 'ASP.NET Experience' 

select @xml.value('(//Qualifications/Qualification[@QualificationName=sql:variable("@Qualification")]/@Remark)[1]', 'varchar(10)') 
+0

Мне нужно сделать заказ по Запоминающее значение для одного определенного Квалификационного имени. Я не знаю этого QualificationName, прежде чем пользователь его выберет. – Anubis

1

Я предположил, ваш XML как:

<Qualifications> 
    <HasDrsdegree>Yes</HasDrsdegree> 
    <ASPNETExperience>2</ASPNETExperience> 
    <Sex>M</Sex> 
</Qualifications> 

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

Select EntityID,Data,T2.Loc.value('.','int') as 'experience' 
from [yourtablename] 
cross apply Data.nodes('/Qualifications/ASPNETExperience') as T2(Loc) 
order by experience