I have some code that generates SQL. It has some embedded TABs in the output that is being generated - so that the code all lines up nicely but I also want to add a "-- Comment
" to the end of the line, and I would like those to line up too, but I need help with how to calculate how long the string is, including "expanded TABs" where appropriate.
SELECT *
INTO #TEMP
FROM
(
SELECT [TheData] = '1234567'
UNION ALL SELECT '12345678'
UNION ALL SELECT '123456789'
UNION ALL SELECT '123456789.'
UNION ALL SELECT '123456789.1'
UNION ALL SELECT '123456789.12'
UNION ALL SELECT '123456789.123'
UNION ALL SELECT '123456789.1234'
UNION ALL SELECT '123456789.1234'
UNION ALL SELECT '123456789.12345'
UNION ALL SELECT '123456789.123456'
UNION ALL SELECT '123456789.1234567'
UNION ALL SELECT '123456789.12345678'
UNION ALL SELECT '123456789.123456789'
UNION ALL SELECT 'A' + CHAR(9) + '9.123456789'
UNION ALL SELECT 'AA' + CHAR(9) + '9.123456789'
UNION ALL SELECT 'AAA' + CHAR(9) + '9.123456789'
UNION ALL SELECT 'AAAA' + CHAR(9) + '9.123456789'
UNION ALL SELECT 'AAAAA' + CHAR(9) + '9.123456789'
UNION ALL SELECT 'AAAAAA' + CHAR(9) + '9.123456789'
UNION ALL SELECT 'AAAAAAA' + CHAR(9) + '9.123456789'
UNION ALL SELECT 'A' + CHAR(9) + 'B' + CHAR(9) + '789'
UNION ALL SELECT 'A' + CHAR(9) + 'BB' + CHAR(9) + '789'
UNION ALL SELECT 'A' + CHAR(9) + 'BBB' + CHAR(9) + '789'
UNION ALL SELECT 'A' + CHAR(9) + 'BBBB' + CHAR(9) + '789'
UNION ALL SELECT 'A' + CHAR(9) + 'BBBBB' + CHAR(9) + '789'
UNION ALL SELECT 'A' + CHAR(9) + 'BBBBBB' + CHAR(9) + '789'
UNION ALL SELECT 'A' + CHAR(9) + 'BBBBBBB' + CHAR(9) + '789'
) AS T
SELECT
TheData
+ REPLICATE(CHAR(9), ((MaxTheDataLen/8+1)*8 - (LEN(TheData)/8+1)*8) / 8 + 1)
+ '-- Some aligned data'
-- + ', Len=' + CONVERT(varchar(20), LEN(TheData))
-- + ', Calc=' + CONVERT(varchar(20), ((MaxTheDataLen/8+1)*8 - (LEN(TheData)/8+1)*8) / 8 + 1)
FROM #TEMP
CROSS APPLY
(
SELECT [MaxTheDataLen] = MAX(LEN(TheData))
FROM #TEMP
) AS X
Output is like this:
1234567 -- Some aligned data
12345678 -- Some aligned data
123456789 -- Some aligned data
123456789. -- Some aligned data
123456789.1 -- Some aligned data
123456789.12 -- Some aligned data
123456789.123 -- Some aligned data
123456789.1234 -- Some aligned data
123456789.1234 -- Some aligned data
123456789.12345 -- Some aligned data
123456789.123456 -- Some aligned data
123456789.1234567 -- Some aligned data
123456789.12345678 -- Some aligned data
123456789.123456789 -- Some aligned data
With no embedded TABs the calculation works fine, but WITH embedded TABs the character-count gives the wrong value, of course:
A 9.123456789 -- Some aligned data
AA 9.123456789 -- Some aligned data
AAA 9.123456789 -- Some aligned data
AAAA 9.123456789 -- Some aligned data
AAAAA 9.123456789 -- Some aligned data
AAAAAA 9.123456789 -- Some aligned data
AAAAAAA 9.123456789 -- Some aligned data
A B 789 -- Some aligned data
A BB 789 -- Some aligned data
A BBB 789 -- Some aligned data
A BBBB 789 -- Some aligned data
A BBBBB 789 -- Some aligned data
A BBBBBB 789 -- Some aligned data
A BBBBBBB 789 -- Some aligned data
What I want is the right hand bit all aligned, even when the left hand bit has embedded TABs.