TSql xml查询是连接值

时间:2016-11-23 14:53:27

标签: sql sql-server sql-server-2012

当我在temp变量中查询xml列时,如果xml元素具有多个值,则结果将被连接。以下是xml列的摘录 -

 <metadata>
   <dataType>Date</dataType>
    <tags>
      <tag>SPA</tag>
      <tag>Timed Release</tag>
    </tags>
 </metadata>

注意两个标签元素。我需要为每个标签元素添加一行。这是我的查询 -

 SELECT id,
    dataType = [Type].value('(/metadata/tags)[1]', 'varchar(max)')
 FROM
@tmpProperty

产生以下

 id   | dataType
 -----+-------------------
 6357 | SPATimed Release

如果我将查询更改为

 SELECT id,
dataType = [Type].value('(/metadata/tags/tag)[1]', 'varchar(max)')
FROM
@tmpProperty

我得到了

 id   | dataType
 -----+-----------
 6357 | SPA

两种结果都是错误的。一个连接成一行而不是两行,另一个只返回一个值。我正在使用sql server 2012.我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您需要先使用nodes()获取多行,然后您可以使用value()来提取数据:

DECLARE @tmpProperty TABLE (ID INT IDENTITY, [Type] XML);
INSERT @tmpProperty([Type])
VALUES ('<metadata>
   <dataType>Date</dataType>
    <tags>
      <tag>SPA</tag>
      <tag>Timed Release</tag>
    </tags>
 </metadata>');

 SELECT id,
        dataType = Tags.value('(text())[1]', 'varchar(max)')
 FROM   @tmpProperty AS t
        CROSS APPLY t.[Type].nodes('/metadata/tags/tag') AS n (Tags);