2016-11-23 52 views
0

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

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

注意两个标签元素。每个标签元素需要一行。这是我的query

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

您需要使用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); 
+0

完美!谢谢! –