REPLICATE
restituisce il tipo di input indipendentemente dall'assegnazione successiva. È fastidioso, ma per evitare il troncamento silenzioso, prova:
SET @x = REPLICATE(CONVERT(VARCHAR(MAX), 'a'), 10000);
Questo perché SQL Server esegue REPLICATE
operazione prima che consideri a cosa lo stai assegnando o quanti caratteri stai cercando di espanderlo. Si preoccupa solo dell'espressione di input per determinare cosa dovrebbe restituire e, se l'input non è un tipo max, presume che rientri in 8.000 byte. Questo è spiegato in Libri in linea
: