You're missing the initial
SELECT
. You can also simplify the join to avoid the nested queries.
set @cols = N'SELECT STUFF((SELECT DISTINCT '','' + QUOTENAME(f.STATENAME)
FROM ' + QUOTENAME(@dbnm) + N'.dbo.M_STATEWISEGSTINACTAG As e INNER JOIN
' + QUOTENAME(@dbnm) + N'.dbo.M_STATEMASTER As f ON e.code = f.code
FOR XML PATH(''''), TYPE).value(''.'', ''NVARCHAR(MAX)''), 1, 1, '''')'