REPLICATE
devuelve el tipo de entrada independientemente de la asignación posterior. Es molesto, pero para evitar el truncamiento silencioso, intente:
SET @x = REPLICATE(CONVERT(VARCHAR(MAX), 'a'), 10000);
Esto se debe a que SQL Server realiza REPLICATE
operación antes de que considere a qué lo está asignando o a cuántos caracteres está tratando de expandirlo. Solo se preocupa por la expresión de entrada para determinar qué debe devolver, y si la entrada no es de tipo máximo, asume que debe caber dentro de los 8000 bytes. Esto se explica en Books Online
: