Sql server 如何在SQL中从xml列获取元素的所有值
我在sql中有以下xml列:Sql server 如何在SQL中从xml列获取元素的所有值,sql-server,xml,Sql Server,Xml,我在sql中有以下xml列: 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> <LastNa
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>
但是面对错误“选择content.query('/Employee/FirstName')作为FirstName,选择content.query('/Employee/Gender[1]')作为dbo.sampleXML中的Gender,其中content.value('/Employee/Gender','varchar(10)='Male'”1),在使用.value时需要在xpath表达式的每个级别指定序号
2) 在性别文本中有额外的空格,因此需要将它们包含在where子句中,即“Male”
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 '
正如您应该看到的错误消息所表明的那样,
value()
XML方法需要保证返回单例值或空的XPath/XQuery/Employee/Gender[1]
在Employee
中首先返回Gender
子项,但不能保证XML中只有一名Employee
也就是说,您需要将索引放在Employee
和Gender
之后,以保证返回值为单例或空,或者,用括号包装整个XPath,只返回第一个匹配的值,如下所示:
(/Employee/Gender)[1]
此外,示例XML中的
Gender
元素值周围有空格,因此它不会被'Male'
过滤器匹配。您可能希望使用LTRIM(RTRIM())
删除周围的空格,因为XPathnormalize-space()
在SQL Server XPath/XQuery中不可用。从我的问题中可以看出,您希望过滤XML以仅显示男性。您可以通过.nodes()
中的过滤器谓词来实现这一点
注意:比较字符串是“(space)Male(space)”,因为您的数据是这样的
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);
OP不想选择第一个男性,而是要筛选所有男性条目……从OP的样本数据判断,表行的XML列中只有一名员工。。。不知道他的真实数据是的,没错。。。我的错。。。快乐编码!
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