如何工作或事物的逻辑和SQL中的XML路径
如何工作或事物的逻辑和SQL中的XML路径
我的输出是正确的,但我想知道STUFF是如何工作的。\n我有一个简单的查询,返回@startDate
和@endDate
之间的总月数。\n我通过使用STUFF将这些月份存储到@cols中。\n查询如下:\n
SELECT DISTINCT ',' + Quotename(CONVERT(CHAR(10), startdate, 120)) FROM #tempdates
\n
- \n
- 查询中的\",\"应该在值之前打印,但输出结果如下。
- 如果我从stuff中移除XML Path,我将得到空值。
- STUFF和XML Path是如何工作的
\n
\n
\n
\n这是我的输出:\n\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
如何使用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函数。
感谢您的努力。谢谢您宝贵的时间。