Not certain what is causing the problem, nothing in the code should limit the length apart from the maximum 2Gb limit of the varchar(max). Consider the following example
😎
GO
SET NOCOUNT ON;
/* Create a 24000 character string variable
Replicate has a limit of 8000 bytes, so we fill one variable
and then concatenate into another three times the value
*/
DECLARE @TSTR_1 VARCHAR(MAX) = REPLICATE('1234567890',800)
DECLARE @TSTR_2 VARCHAR(MAX) = @TSTR_1 + @TSTR_1 + @TSTR_1;
DECLARE @SAMPLE_DATA TABLE
(
CallStartDateTime DATE NOT NULL
,MenuNames VARCHAR(MAX) NOT NULL
);
INSERT INTO @SAMPLE_DATA(CallStartDateTime,MenuNames)
VALUES
('2014-09-18','srinivas;saipu;vasu;krishna;srinivas;saipu;krishna')
,('2014-09-17','srinivas;saipu;vasu;krishna;srinivas;saipu;krishna;vasu;saipu')
,('2014-09-18','krishna;srinivas;saipu;vasu')
,('2014-09-18','saipu;vasu;a1;a2;a3;.......a100')
,('2014-09-16','saipu;vasu;a1;a2;a3;.......a100')
,('2014-09-18',@TSTR_2 );
;WITH DISTINCT_DATES AS
(
SELECT DISTINCT
SD.CallStartDateTime
FROM @SAMPLE_DATA SD
)
SELECT
DD.CallStartDateTime
,STUFF((SELECT CHAR(44) + SD.MenuNames
FROM @SAMPLE_DATA SD
WHERE DD.CallStartDateTime = SD.CallStartDateTime
FOR XML PATH(''),TYPE).value('.[1]','VARCHAR(MAX)'),1,1,'') AS MenuNames
,LEN(STUFF((SELECT CHAR(44) + SD.MenuNames
FROM @SAMPLE_DATA SD
WHERE DD.CallStartDateTime = SD.CallStartDateTime
FOR XML PATH(''),TYPE).value('.[1]','VARCHAR(MAX)'),1,1,'')) AS Menu_Len
FROM DISTINCT_DATES DD;
Results (chopped)
CallStartDateTime MenuNames Menu_Len
----------------- ----------------------------- ---------
2014-09-16 saipu;vasu;a1;a2;a3;..... 31
2014-09-17 srinivas;saipu;vasu;krish 61
2014-09-18 srinivas;saipu;vasu;krish.. 24111