REPLICATE
renvoie le type d'entrée indépendamment de l'affectation ultérieure. C'est ennuyeux, mais pour éviter la troncature silencieuse, essayez :
SET @x = REPLICATE(CONVERT(VARCHAR(MAX), 'a'), 10000);
C'est parce que SQL Server effectue le REPLICATE
opération avant de considérer ce à quoi vous l'assignez ou le nombre de caractères que vous essayez de développer. Il ne se soucie que de l'expression d'entrée pour déterminer ce qu'il doit renvoyer, et si l'entrée n'est pas un type max, il suppose qu'il est censé tenir dans 8 000 octets. Ceci est expliqué dans Livres en ligne
: