A instrução EXECUTE simplesmente tem uma gramática diferente de outras instruções como SELECT e SET. Por exemplo, observe a seção de sintaxe na parte superior das duas páginas a seguir.
Declaração EXECUTE:http://msdn.microsoft.com/en-us/ library/ms188332.aspx
Instrução SET:http://msdn.microsoft.com/en-us/ library/ms189484.aspx
A sintaxe para EXECUTE aceita apenas um valor
Enquanto a sintaxe para SET aceita uma expressão
Um valor é basicamente apenas uma constante codificada, mas uma expressão será avaliada. É como ter o varchar 'SELECT 1 + 1'. É apenas um valor varchar agora. No entanto, você pode avaliar a string assim:
EXEC('SELECT 1 + 1')
Suponho que tudo o que estou apontando é que o comando EXEC não permite expressões por definição, o que você aparentemente já descobriu. Não sei qual era a intenção dos desenvolvedores do T-SQL quando o fizeram assim. Suponho que a gramática ficaria fora de controle se você tivesse permissão para lançar subconsultas dentro de subconsultas na lista de parâmetros de um procedimento armazenado.
Expressão T-SQL:http://msdn.microsoft.com/en- us/library/ms190286.aspx