Isso não funcionará, pois você não pode ter o nome da coluna entre aspas. O que você está fazendo essencialmente é fazer com que o SQL compare duas strings que sempre serão diferentes, o que significa que você nunca executará uma atualização.
Se você deve fazer isso dessa maneira, você teria que ter algo como...
DECLARE @a INT
DECLARE @b VARCHAR
SET @a = 1
WHILE @a < 30
BEGIN
set @b = @a
exec sp_executesql N'UPDATE source set h = h + 'x_'[email protected] + N'
where y_'[email protected] + N' = ''Sold'''
SET @a = @a + 1
END
Em geral, no entanto, eu desencorajaria essa prática. Não sou fã de SQL dinâmico sendo gerado dentro de outra instrução SQL para qualquer tipo de código de produção. Muito útil para realizar tarefas de desenvolvimento pontuais, mas não gosto disso para código que pode ser executado por um usuário.