如何从SQL中的xml列获取元素的所有值

时间:2016-03-29 20:34:19

标签: sql-server xml

我在sql中有以下xml列:

NSString *videoPath = [documentsDirectory stringByAppendingString:finalPath];

尝试读取性别为男性的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>

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

但是面对错误&#34;选择content.query(&#39; / Employee / FirstName&#39;)作为FirstName,content.query(&#39; / Employee / Gender [1]&#39; )来自dbo.sampleXML的性别,其中content.value(&#39; /员工/性别&#39;,&#39; varchar(10)&#39;)=&#39;男性&#39;&#34;

3 个答案:

答案 0 :(得分:3)

1)当你使用.value

时,需要在xpath表达式的每个级别指定序号。

2)您在Gender文字中有额外的空格,因此您需要将它们包含在where子句中,即&#39;男&#39;

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 :(得分:2)

根据您提出的问题,您希望过滤您的XML以仅显示男性人员。您可以使用.nodes()中的过滤谓词来实现此目的。

注意:比较字符串为&#34;(空格)男性(空格)&#34;因为你的数据是这样的。

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

答案 2 :(得分:1)

正如您应该看到的错误消息所示,value() XML方法需要一个保证返回单例值或为空的XPath / XQuery。 /Employee/Gender[1]会在Gender中返回第一个Employee子项,但不能保证XML中只有一个Employee

那就是说,你需要在EmployeeGender之后放置索引来保证单例或空返回值,或者用括号包装整个XPath并返回第一个像这样的匹配:

(/Employee/Gender)[1]

此外,示例XML中的Gender元素值具有空格,因此'Male'过滤器无法匹配。您可能希望使用LTRIM(RTRIM())删除周围空格,因为XPath normalize-space()在SQL Server XPath / XQuery中不可用。