How Stuff Works Or Logic of Stuff & XML Path in SQL
Stuff works on strings, the only thing its doing on your SQL is remove the initial comma from position 1. Without stuff it would look like ,a,b,c,d but when you stuff the position one with an empty value it transforms it to a,b,c,d
Your question is probably more about what FOR XML is doing. In this case, the FOR XML
is being applied as a "trick" to concatenate all the rows from #tempDates
in one long comma-separated string ,a,b,c,d and stuff is just removing that first comma.
For xml is creating a string x = ',a' + ',b' +',c' + ',d' so x ends up as ',a,b,c,d'
Stuff(x,1,1,'')
is replacing only the comma in position 1 to 1 with '' therefore is now x='a,b,c,d'
[STUFF ( character_expression , start , length , replaceWith_expression )]
Hardik Parmar
I am a software developer at Webtonic services Pvt Ltd. I am working in C#, ASP.NET & SQL technologies. Coding is my Passion I really enjoy when I learn new things in Programming. Thought that Inspire me : If you don't builld your dreams someone will hire you to build theirs....!!!!!
Updated on June 05, 2022Comments
-
Hardik Parmar almost 2 years
My Output is correct but I want to know how actually STUFF works.
I have the simple query which returns me total number of months between
@startDate
&@endDate
.I am storing that months into the the @cols by help of STUFF.
Query is like this :
SELECT DISTINCT ',' + Quotename(CONVERT(CHAR(10), startdate, 120)) FROM #tempdates
- "," in the query should print before the values but it print like below O/P.
- If I remove XML Path from the stuff I am getting null value.
- How actually STUFFworks with XML path
Here's My output :
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
-
Hardik Parmar almost 10 yearsThanx for edit @Gidil but I want help to understand stuff.
-
Lasse V. Karlsen almost 10 yearsTo be honest I think you should capitalize the word STUFF everywhere in your post, otherwise it just seems you want to know how stuff works, you know, stuff, things, thingamajigs.
-
puzzlepiece87 over 8 yearsPossible duplicate of How Stuff and For Xml Path work in Sql Server
-
Hardik Parmar almost 10 yearsOkay I got it but if first comma is only for replacement then hoe comma is coming after the value
-
Hardik Parmar almost 10 yearsThat's Great! Means first whole string will be form like as you have mentioned in the example then it XML will remove only first comma from it. I thought it delete comma from every row which stuff will get.
-
Hardik Parmar almost 10 yearsLast question : XML path is only used for concatenating the string & why this '.' is used in my query.
-
Jayvee almost 10 years'.' in xml path means 'current element' so basically you are taking the value of the current element (,a,b,c,d) as nvarchar and return it to the stuff function
-
Hardik Parmar almost 10 yearsI appreciate your efforts. Thank you for your valuable time.