Har*_*mar 8 xml sql sql-server sql-server-2008
我的输出是正确的,但我想知道STUFF实际上是如何工作的.
我有简单的查询,它返回@startDate&之间的总月数@endDate.
我在STUFF的帮助下将这几个月存入@cols .
查询是这样的:
SELECT DISTINCT ','
+ Quotename(CONVERT(CHAR(10), startdate, 120))
FROM #tempdates
Run Code Online (Sandbox Code Playgroud)
这是我的输出:

DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX),
@startdate datetime = '1-Jan-2014',
@enddate datetime = '1-Jun-2014'
;with cte (StartDate, EndDate) as
(
select min(@startdate) StartDate, max(@enddate) EndDate
union all
select dateadd(mm, 1, StartDate), EndDate
from cte
where StartDate < EndDate
)
select StartDate
into #tempDates
from cte
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(convert(CHAR(10), StartDate, 120))
from #tempDates
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
select @cols
drop table #tempDates
Run Code Online (Sandbox Code Playgroud)
Jay*_*vee 18
Stuff对字符串起作用,它在SQL上做的唯一事情是从位置1删除初始逗号.没有东西它看起来像a,b,c,d但是当你填充一个空值的位置时它会转换它到a,b,c,d
您的问题可能更多是关于FOR XML正在做什么.在这种情况下,FOR XML它被用作"技巧"来连接#tempDates一个长逗号分隔的字符串中的所有行,a,b,c,d和stuff只是删除第一个逗号.
因为xml正在创建一个字符串x =','+',b'+',c'+',d'所以x最终为',a,b,c,d'
Stuff(x,1,1,'') 正在用''替换位置1到1中的逗号,因此现在是x ='a,b,c,d'
[STUFF ( character_expression , start , length , replaceWith_expression )]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14533 次 |
| 最近记录: |