Básicamente yo lo solucioné de la misma forma, pero lo hice en una función un poco más general, para usarla de donde tenga ese problema (solo en los campos Memo o Varchar). Si se crean nuevos campos en la base ya los hago que sean Text.
Código Delphi
[-]class function TFuncionesComponentes.TraerCampoGrandeSQLServer(Tabla, Campo, FiltroParaUnRegistro, TextoCampo: String): string; ... //Traigo la longitud del campo Qry.Sql.Text := 'SELECT LEN('+Campo+') AS LONGITUD FROM '+Tabla; ... CantidadVeces := TamanioCampo DIV sizeDiv; if ((TamanioCampo MOD sizeDiv)<>0) then CantidadVeces := CantidadVeces + 1; ... sizeDiv := 255; with Qry.SQL do begin Clear; Add('SELECT SubString('+Campo+',1,'+IntToStr(sizeDiv)+') AS P1'); //El inicio lo paro en un caracter más i := sizeDiv + 1; for j := 2 to CantidadVeces do begin Add(', SubString('+Campo+','+IntToStr(i)+','+IntToStr(sizeDiv)+') AS P'+IntToStr(j)); i := (j * sizeDiv) + 1; end; Add('FROM '+Tabla); Add('WHERE '+FiltroParaUnRegistro); end; Qry.Open; //Ahora tengo que unir todos los substrings que obtube StrTemp := ''; for j := 1 to CantidadVeces do StrTemp := StrTemp + qry.FieldByName('P'+IntToStr(j)).AsString; Result := StrTemp; ...