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;
...
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');
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;
StrTemp := '';
for j := 1 to CantidadVeces do
StrTemp := StrTemp + qry.FieldByName('P'+IntToStr(j)).AsString;
Result := StrTemp;
...