Sql server 在SQL中从XML获取值时添加分隔符

Sql server 在SQL中从XML获取值时添加分隔符,sql-server,xml,tsql,xpath,xquery,Sql Server,Xml,Tsql,Xpath,Xquery,我有下面的XML代码片段,我正在尝试使用SQLServer以表格格式阅读它 declare @ProductXML varchar(max); set @ProductXML = '<hashtable> <entry> <string>host</string> <string-array> <string>csdfs</string> </string-array

我有下面的XML代码片段,我正在尝试使用SQLServer以表格格式阅读它

declare @ProductXML varchar(max);
set @ProductXML = '<hashtable>   <entry>
    <string>host</string>
    <string-array>
      <string>csdfs</string>
    </string-array>
  </entry>
 <entry> <string>dom</string><map-array>
      <map>
        <entry>
          <string>thirdlevelentrey</string>
          <vector>
            <string>1in</string>
            <string>2in</string>
            <string>3in</string>
            <string>4in</string>
            <string>5in</string>
          </vector>
        </entry>
      </map>
    </map-array></entry>
</hashtable>'

DECLARE @xml xml

SELECT @xml = CAST(CAST(@ProductXML AS VARBINARY(MAX)) AS XML)

SELECT  
    x.Rec.query('./string').value('.', 'nvarchar(50)') AS 'Product Name', 
    x.Rec.query('./vector/string').value('.', 'nvarchar(50)') AS 'Product TLDs' 
FROM 
    @xml.nodes('/hashtable/entry/map-array/map/entry') AS x(Rec)
declare@ProductXML varchar(max);
set@ProductXML=
主办
可持续发展基金
多姆
第三层
1in
2in
3英寸
4英寸
5英寸
'
声明@xml
选择@xml=CAST(CAST(@ProductXML作为VARBINARY(MAX))作为xml)
挑选
x、 Rec.query('./string')。值('.',nvarchar(50)')作为“产品名称”,
x、 Rec.query('./vector/string')。值('.',nvarchar(50)')作为“产品TLD”
从…起
@xml.nodes('/hashtable/entry/map array/map/entry')作为x(Rec)
我面临的问题是第二列
产品TLD
。在向量下,多行值合并到单个文本中。我希望它们带有分隔符或带分隔符的文本,以便以后使用时能够识别它们

如果有人能帮我放置分离器或除沫器,如
1in | 2in | 3in

或者可以在子表中将thirdlevelentry视为一个表来处理。

您可以使用

SUBSTRING(
x.Rec.query('for $string in ./vector/string/text()  
            return  concat("|", $string)
').value('.', 'nvarchar(50)'),
2,50) AS [Product TLDs]
REPLACE(
x.Rec.query('for $string in ./vector/string/text()  
            return string($string)
').value('.', 'nvarchar(50)'),
' ','|') AS [Product TLDs] 
这是回报

1in |2in |3in |4in |5in
所以注入了一些额外的空间。如果要连接的值不包含任何可以使用的空格

SUBSTRING(
x.Rec.query('for $string in ./vector/string/text()  
            return  concat("|", $string)
').value('.', 'nvarchar(50)'),
2,50) AS [Product TLDs]
REPLACE(
x.Rec.query('for $string in ./vector/string/text()  
            return string($string)
').value('.', 'nvarchar(50)'),
' ','|') AS [Product TLDs] 
返回

1in|2in|3in|4in|5in

如果
中的值不包含空格,则有一个非常简单的解决方案:

SELECT  
    x.Rec.query('./string').value('.', 'nvarchar(50)') AS 'Product Name', 
    x.Rec.query('data(./vector/string)').value('.', 'nvarchar(50)') AS 'Product TLDs' 
FROM 
    @xml.nodes('/hashtable/entry/map-array/map/entry') AS x(Rec);
XQuery
函数
.data()
将返回所有内容,并以空格作为分隔符。我不知道,为什么他们不添加第二个参数来指定分隔符


如果字符串包含空格,Martin Smith的
FLWOR
方法非常好

Mysql与ms sql server无关。如果需要,他们可以使用REPLACE将空间转换为管道needed@MartinSmith当然,就像你的第二个建议。。。你知道为什么没有机会指定分隔符吗?不,我不太熟悉Xquery的复杂性。可惜SQL Server不支持
字符串联接