SQL中Stuff和XML路径的工作原理或逻辑

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)
  1. 查询中的","应在值之前打印,但打印方式如下面的O/P.
  2. 如果我从东西中删除XML路径,我将获得null值.
  3. 实际上STUFFworks如何使用XML路径

这是我的输出:

在此输入图像描述

 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)

  • '' 在xml路径中意味着'当前元素'所以基本上你将当前元素(,a,b,c,d)的值作为nvarchar并将其返回到stuff函数 (3认同)