2016-03-29 3 views
2

У меня есть следующий столбец XML в SQL:Как извлечь все значение элемента из столбца XML в SQL

Create table dbo.sampleXML(ID int identity(1,1) primary key, 
Name char(10) not null, 
content xml null) 
go 

insert into dbo.sampleXML (Name,content) values ('ss',CAST('<Employee> 
<FirstName> ss </FirstName> 
<LastName> nn </LastName> 
<Gender> Male </Gender> 
<Age>31</Age> 
</Employee> 

' as xml)) 
insert into dbo.sampleXML (Name,content) values ('xx',CAST('<Employee> 
<FirstName> xx </FirstName> 
<LastName> yy </LastName> 
<Gender> Male </Gender> 
<Age>3</Age> 
</Employee> 

insert into dbo.sampleXML (Name,content) values ('dd',CAST('<Employee> 
    <FirstName> ss </FirstName> 
    <LastName> dd </LastName> 
    <Gender> Female </Gender> 
    <Age>30</Age> 
    </Employee> 

Пробовал читать все значения из XML, чей пол мужского пола. Пытались это

select content.query ('/Employee/FirstName') as FirstName,content.query('/Employee/Gender[1]') as Gender from dbo.sampleXML where content.value ('/Employee/Gender','varchar(10)')='Male' 

Но перед ошибка «выберите content.query ('/ Employee/FirstName'), как FirstName, content.query ('/ Employee/Пол [1]), как Пол из dbo.sampleXML где content.value ('/ Employee/Пол', 'VARCHAR (10)') = 'Мужской'»

ответ

2

С вашего вопроса беру, что вы хотите фильтр ваш XML только, чтобы показывать только мужчина человек. Вы достигаете этого с помощью предиката фильтра в .nodes().

Внимание: Строка сравнения: «(пробел) Мужской (пробел)», потому что ваши данные таковы.

Create table dbo.sampleXML(ID int identity(1,1) primary key, 
Name char(10) not null, 
content xml null) 
go 

insert into dbo.sampleXML (Name,content) values ('ss',CAST('<Employee> 
<FirstName> ss </FirstName> 
<LastName> nn </LastName> 
<Gender> Male </Gender> 
<Age>31</Age> 
</Employee>' as xml)); 
insert into dbo.sampleXML (Name,content) values ('xx',CAST('<Employee> 
<FirstName> xx </FirstName> 
<LastName> yy </LastName> 
<Gender> Male </Gender> 
<Age>3</Age> 
</Employee>' as xml)); 
insert into dbo.sampleXML (Name,content) values ('dd',CAST('<Employee> 
<FirstName> ss </FirstName> 
<LastName> dd </LastName> 
<Gender> Female </Gender> 
<Age>30</Age> 
</Employee>' as xml)); 

SELECT ID 
     ,Filtered.Males.value('Gender[1]','varchar(max)') AS Gender 
     ,Filtered.Males.value('FirstName[1]','varchar(max)') AS FirstName 
     ,Filtered.Males.value('LastName[1]','varchar(max)') AS LastName 
     ,Filtered.Males.value('Age[1]','int') AS Age 
FROM dbo.sampleXML 
CROSS APPLY content.nodes('/Employee[Gender=" Male "]') AS Filtered(Males); 

Результат

ID Gender FirstName LastName Age 
1 Male ss   nn  31 
2 Male xx   yy  3 
3

1) вы должны указать порядковый номер на каждом уровне вашего выражения XPath при использовании .value

2) У вас есть дополнительные пробелы внутри полных литералов, поэтому вам нужно включить их в предложение where, то есть «Мужской»

select content.query ('/Employee/FirstName') as FirstName,content.query('/Employee/Gender[1]') as Gender 
from dbo.sampleXML 
where content.value ('/Employee[1]/Gender[1]','varchar(10)')=' Male ' 
1

В качестве сообщения об ошибке, которое вы должны были увидеть, value() Метод XML требует XPath/XQuery, который гарантированно возвращает значение Singleton или пустое. /Employee/Gender[1] возвращает сначала Gender ребенка в Employee, в то время как не гарантировано, что в XML есть только один Employee.

Тем не менее, вам нужно поставить индекс после Employee и Gender гарантировать синглтон или пустое возвращаемое значение, или в качестве альтернативы, обернуть весь XPath со скобками и возвращать только первое соответствие следующим образом:

(/Employee/Gender)[1] 

Кроме того, значение Gender элементов в вашем образце XML имеет пробелы, поэтому он не будет соответствовать фильтру 'Male'. Вы можете использовать LTRIM(RTRIM()), чтобы удалить окружающие пространства, поскольку XPath normalize-space() недоступен в SQL Server XPath/XQuery.

+0

ОП не хотел, чтобы сделать первое лицо мужского пола, но и фильтровать все мужские записи ... – Shnugo

+0

Судя по данным выборки OP, есть только один сотрудник в XML столбец в строке таблицы ... не знаю о его реальных данных tho – har07

+0

Да, правда ... Мой плохой ... Счастливое кодирование! – Shnugo

Смежные вопросы