我正在尝试从以下xml文档中提取值
<response>
<entry>
<title>the tales</title>
<subject-area code="1" abbrev="XX1">Test1</subject-area>
<subject-area code="2" abbrev="XX2">Test2</subject-area>
</entry>
</response>
但是我在获取主题区文本值时遇到问题,即“Test1”
我正在使用下面的T-SQL来提取其余的值,我在节点上使用了交叉appy,因为我需要循环获取所有值,所以不能使用[1]等来以这种方式提取它,因为我不确定会有多少主题区域。
任何想法
SELECT
,a.APIXMLResponse.value('(response[1]/entry[1]/title[1])','VARCHAR(250)') AS Title
,sa.value('(./@code)','varchar(10)') AS SubjectAreaCode
,sa.value('(./@abbrev)','varchar(10)') AS SubjectAreaAbbrev
FROM [dbo].[APIXML] a
CROSS APPLY APIXMLResponse.nodes('response/entry/subject-area') AS SubjectArea(sa)
答案 0 :(得分:0)
虽然评论中已有解决方案,但我想指出一些事情:
'.'
作为路径会导致非常烦人的效果。 text()[1]
在实际位置读取所需的值(Here are some details with examples)。NVARCHAR(x)
,因此使用NVARCHAR
作为目标类型会稍微快一点(如果您没有理由不这样做...... 这是我的疑问:
SELECT
a.APIXMLResponse.value('(response/entry/title)[1]','NVARCHAR(250)') AS Title
,sa.value('@code','nvarchar(10)') AS SubjectAreaCode
,sa.value('@abbrev','nvarchar(10)') AS SubjectAreaAbbrev
,sa.value('text()[1]','nvarchar(10)') AS SubjectAreaContent
FROM @mockup a
CROSS APPLY APIXMLResponse.nodes('response/entry/subject-area') AS SubjectArea(sa)