SELECT ... FOR XML PATH(' '),1,1) 是啥意思?

Posted

技术标签:

【中文标题】SELECT ... FOR XML PATH(\' \'),1,1) 是啥意思?【英文标题】:What is the meaning of SELECT ... FOR XML PATH(' '),1,1)?SELECT ... FOR XML PATH(' '),1,1) 是什么意思? 【发布时间】:2014-03-04 14:52:12 【问题描述】:

我正在questionand here 之一中学习 sql,我看到了这个的用法,有人能让我理解 sql 中的 xml path('') 的含义吗?是的,我浏览了我不太了解的网页!

我没有得到后面的东西,现在这段代码做什么?(只有select部分)

declare @t table
(
    Id int,
    Name varchar(10)
)
insert into @t
select 1,'a' union all
select 1,'b' union all
select 2,'c' union all
select 2,'d' 

select ID,
stuff(
(
    select ','+ [Name] from @t where Id = t.Id for XML path('')
),1,1,'') 
from (select distinct ID from @t )t

【问题讨论】:

问题标题中的 1,1) 是 stuff 参数! stuff 有 4 个参数 stuff(@expr,start,len,replacement) 所以子查询是表达式,从 positin 1,lenght 1 开始,然后替换为 '' 是的。令人困惑..在很多地方我看到这个空 SQL 字符串 ('') 看起来就像它是一个单双引号 ("),所以看起来你正在传递 "), 1, 1," 到路径()。 【参考方案1】:

这里没有真正的技术可以学习。将多行数据连接成一个字符串只是一个可爱的技巧。与 XML 格式化功能的预期用途相比,它更像是一种功能的古怪使用。

SELECT ',' + ColumnName ... FOR XML PATH('')

根据组合ColumnName 列中的多行数据生成一组逗号分隔值。它将产生一个类似,abc,def,ghi,jkl 的值。

STUFF(...,1,1,'')

然后用于删除前一个技巧生成的前导逗号,有关其参数的详细信息,请参阅STUFF

(奇怪的是,尽管STUFF 只负责最后一点修剪,但很多人倾向于将这种生成逗号分隔值集的方法称为“STUFF 方法”)

【讨论】:

好的..FOR XML PATH( '' ) ), 3, 1000 ) 是什么意思? @george - 如果没有看到更大的查询,很难分辨。正如我希望从我在回答中所说的那样显而易见,FOR XML PATH('') 以及在它之外发生的任何事情都是两个 不同 技巧或用法的一部分,您需要在查询中更早地查看找出传递给, 3, 1000参数的函数。【参考方案2】:

您引用的 SQL 用于MSSQL 中的字符串连接。

它通过在 , 前面使用 for xml path 来连接行到结果 ,a,b,c,d。然后使用stuff 将第一个, 替换为,从而将其删除。

for xml path 中的('') 用于删除自动创建的包装节点。否则它看起来像<row>,a,b,c,d</row>

...
stuff(
  (
  select ',' + CAST(t2.Value as varchar(10)) from #t t2 where t1.id = t2.id 
  for xml path('')
  )
,1,1,'') as Value
...
更多关于stuff 更多关于for xml path

【讨论】:

这里是该技术的一个很好的示例应用:Dynamic Pivoting @David 提到的链接不存在了! @QMaster - 我刚刚验证了它确实是 SQL 之禅:Dynamic Pivoting pratchev.blogspot.com/2008/12/dynamic-pivoting.html

以上是关于SELECT ... FOR XML PATH(' '),1,1) 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

关于for xml path('')

使用for xml path 分组查询

for xml path用法

SQL多行并一行统计例子之STUFF()函数+FOR XML PATH()函数应用

FOR XML PATH 的用法介绍

使用for xml path()进行字符串拼接