T-SQL XML节点值

时间:2018-03-15 10:10:22

标签: sql sql-server xml tsql

我正在尝试从以下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) 

1 个答案:

答案 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)