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

Sql server sql server-xml查询-concat-添加空间,sql-server,xml,qxmlquery,Sql Server,Xml,Qxmlquery,我想获取一个xml字符串,并将其转换为sql表分号分隔符 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('.').q

我想获取一个xml字符串,并将其转换为sql表分号分隔符

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)  
我想要的结果是:没有空间

>>奖励:删除最后一个分号

谢谢大家!

我是如何做到这一点的:

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) 
可能有更好的方法来消除空格,因为这也会替换XML节点值中的任何空格。

替换、反转和填充的组合是我实现这一点的方法:

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

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

这可以更容易地完成:

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

这可以做得容易得多:

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)

好的但是,它也可以删除单元格中的空格。我换了一个看我的回答好!但是,它也可以删除单元格中的空格。我换了一个看到我的答案了吗?太棒了非常感谢。如何对结果进行排序?etc,列?@inon Try ORDER BY v.value'.'中的第一个值'aa1',FOR XMLIt前面的'nvarcharmax'排序列,而不是行…:@伊农,对不起,我不明白。。。是否要按元素名称排序?在这种情况下,请使用本地名称。而不是单曲……太棒了!:非常感谢。如何对结果进行排序?etc,列?@inon Try ORDER BY v.value'.'中的第一个值'aa1',FOR XMLIt前面的'nvarcharmax'排序列,而不是行…:@伊农,对不起,我不明白。。。是否要按元素名称排序?在这种情况下,请使用本地名称。而不是单身。。