How Stuff Works Or Logic of Stuff & XML Path in SQL

14,813

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 )]
Share:
14,813
Hardik Parmar
Author by

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, 2022

Comments

  • Hardik Parmar
    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 
    
    1. "," in the query should print before the values but it print like below O/P.
    2. If I remove XML Path from the stuff I am getting null value.
    3. How actually STUFFworks with XML path

    Here's My output :

    enter image description here

     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
      Hardik Parmar almost 10 years
      Thanx for edit @Gidil but I want help to understand stuff.
    • Lasse V. Karlsen
      Lasse V. Karlsen almost 10 years
      To 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
      puzzlepiece87 over 8 years
  • Hardik Parmar
    Hardik Parmar almost 10 years
    Okay I got it but if first comma is only for replacement then hoe comma is coming after the value
  • Hardik Parmar
    Hardik Parmar almost 10 years
    That'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
    Hardik Parmar almost 10 years
    Last question : XML path is only used for concatenating the string & why this '.' is used in my query.
  • Jayvee
    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
    Hardik Parmar almost 10 years
    I appreciate your efforts. Thank you for your valuable time.