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) 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章