sql server - xml查询 - concat - 添加空间

时间:2016-08-09 13:42:44

标签: sql-server xml qxmlquery

我想取一个xml字符串并将其转换为sql-table分号分隔

declare @x xml --for example
set @x = '<root><row><a>a1</a><b>b2</b></row><row><a>aa1</a><b>bb2</b></row></root>'
SELECT T.c.query('.').query('for $i in row/*/text() return concat($i,";")').value('.', 'nvarchar(max)') AS result  
FROM   @x.nodes('root/row') T(c)  

结果:

a1; b2;
aa1; bb2;

我想要的结果:(没有空格)

a1;b2;
aa1;bb2;

&GT;&GT;额外奖励:删除最后一个分号

a1;b2
aa1;bb2

谢谢!

3 个答案:

答案 0 :(得分:1)

REVERSESTUFFdeclare @x xml --for example set @x = '<root><row><a>a1</a><b>b2</b></row><row><a>aa1</a><b>bb2</b></row></root>' SELECT reverse(stuff(reverse(replace(T.c.query('.').query('for $i in row/*/text() return concat($i,";")').value('.', 'nvarchar(max)'), ' ', '')), 1, 1, '')) AS result FROM @x.nodes('root/row') T(c) 的组合是我能够实现这一目标的方式:

throw new UnauthorizedHttpException('Access unavailable without access_token.', 401);

可能有更好的方法来摆脱空格,因为这也会替换XML节点值中的任何空格。

答案 1 :(得分:1)

这可以更轻松地完成:

DECLARE @xml XML='<root>
  <row>
    <a>a1</a>
    <b>b2</b>
  </row>
  <row>
    <a>aa1</a>
    <b>bb2</b>
  </row>
</root>';

SELECT (
      STUFF(
      (
          SELECT ';' + v.value('.','nvarchar(max)')
          FROM r.nodes('*') AS B(v)
          FOR XML PATH('')
      ),1,1,'')
      )
FROM @xml.nodes('/root/row') AS A(r)

答案 2 :(得分:0)

declare @x xml --for example
set @x = '<root><row><a>a1</a><b>b2</b></row><row><a>aa1</a><b>bb2</b></row></root>'
SELECT reverse(stuff(reverse(replace(T.c.query('.').query('for $i in row/*/text() return concat($i,";")').value('.', 'nvarchar(max)'), '; ', ';')), 1, 1, '')) AS result  
FROM   @x.nodes('root/row') T(c)