如何工作或事物的逻辑和SQL中的XML路径

8 浏览
0 Comments

如何工作或事物的逻辑和SQL中的XML路径

我的输出是正确的,但我想知道STUFF是如何工作的。\n我有一个简单的查询,返回@startDate@endDate之间的总月数。\n我通过使用STUFF将这些月份存储到@cols中。\n查询如下:\n

SELECT DISTINCT ',' 
                + Quotename(CONVERT(CHAR(10), startdate, 120)) 
FROM   #tempdates 

\n

    \n

  1. 查询中的\",\"应该在值之前打印,但输出结果如下。
  2. \n

  3. 如果我从stuff中移除XML Path,我将得到空值。
  4. \n

  5. STUFF和XML Path是如何工作的
  6. \n

\n这是我的输出:\n\"enter\n

 DECLARE @cols AS NVARCHAR(MAX),   
            @query AS NVARCHAR(MAX),  
            @startdate datetime =  '2014年1月1日',  
            @enddate datetime  =  '2014年6月1日'
    ;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

0
0 Comments

如何使用Stuff函数和XML Path在SQL中的逻辑

在SQL中,Stuff函数是用来操作字符串的,它的作用是从位置1开始删除逗号。如果没有使用Stuff函数,字符串看起来像这样:,a,b,c,d,但是当使用Stuff函数将位置1的值替换为空时,它会变成a,b,c,d。

你的问题可能更关于FOR XML的作用。在这种情况下,FOR XML被应用为一种"技巧",用于将#tempDates中的所有行连接成一个长的逗号分隔的字符串,a,b,c,d,而Stuff函数只是移除了这个字符串中的第一个逗号。

FOR XML创建了一个字符串x = ',a' + ',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 )]

好的,但是如果第一个逗号只是用来替换,那么值后面的逗号是怎么来的呢?

太好了!意思是首先整个字符串会像你在例子中提到的那样形成,然后XML将只删除它的第一个逗号。我以为它会删除每一行中stuff函数获取到的逗号。

最后一个问题:XML路径只用于连接字符串,为什么我的查询中使用了'.'?

在xml路径中的'.'表示"当前元素",所以基本上你正在将当前元素的值(,a,b,c,d)作为nvarchar类型提取出来,并将其返回给stuff函数。

感谢您的努力。谢谢您宝贵的时间。

0