Я думаю, что именно так вы пытаетесь присвоить значение. Попробуйте использовать следующий метод:
declare @s varchar(max);
with temp as
(
select ....
from ... join c on .... join c on .... join c on ....
for xml raw('...'), elements
)
select @s = value from temp
select @s
Как говорится в сообщении об ошибке, ваша реальная проблема заключается в том, что оператор перед вашим CTE не заканчивается ;
, что является обязательным требованием при использовании CTE.
Я выполнил вышеупомянутое с select 'test' as value
, определяющим CTE вместо вашего запроса, и он работал как ожидалось.