I tested with the code below and varchar(max) acts as expected when concatenating with the + operator when the number of rows are known.. However a programmatic solution still seems elusive...
DECLARE @C VARCHAR(MAX)
DECLARE @Code VARCHAR(20)
DECLARE @Value VARCHAR(MAX)
DECLARE @Temp TABLE(
RowID INT IDENTITY(1, 1),
Code VARCHAR(20),
MaxValue VARCHAR(MAX))
INSERT INTO @Temp (
Code,
MaxValue
) VALUES (
/* Code - VARCHAR(20) */ 'A note',
/* Value - VARCHAR(MAX) */ REPLICATE(CAST('A' AS VARCHAR(MAX)), 10000 ) )
INSERT INTO @Temp (
Code,
MaxValue
) VALUES (
/* Code - VARCHAR(20) */ 'B note',
/* Value - VARCHAR(MAX) */ REPLICATE(CAST('B' AS VARCHAR(MAX)), 10000 ) )
SET @C = ''
SELECT @Code = Code, @Value=MaxValue FROM @Temp WHERE RowID = 1
SELECT @C = @Code + @Value
SELECT @Code = Code, @Value=MaxValue FROM @Temp WHERE RowID = 2
SELECT @C = @C + @Code + @Value
SELECT @C
SELECT LEN(@C)
len output: 20012