REPLICATE
retorna o tipo de entrada independentemente da atribuição posterior. É irritante, mas para evitar o truncamento silencioso, tente:SET @x = REPLICATE(CONVERT(VARCHAR(MAX), 'a'), 10000);
Isso ocorre porque o SQL Server executa o
REPLICATE
operação antes de considerar o que você está atribuindo ou para quantos caracteres você está tentando expandi-lo. Ele só se preocupa com a expressão de entrada para determinar o que deve retornar e, se a entrada não for do tipo máximo, ele assume que deve caber em 8.000 bytes. Isso é explicado em Manuais Online
: