Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在SQL中从xml列获取元素的所有值_Sql Server_Xml - Fatal编程技术网

Sql server 如何在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

我在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>
<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())
删除周围的空格,因为XPath
normalize-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