Pregunta

Estoy tratando de tirar de una gran cantidad de datos de una base de datos de Fox Pro, trabajar con él e insertarla en una base de datos mysql. Es demasiado que hacer todo a la vez por lo que querer hacerlo en lotes de, digamos, 10 000 registros. ¿Cuál es el equivalente al límite del 5, 10 en Fox Pro SQL, le gustaría una instrucción de selección como

Seleccione el nombre, la dirección de las personas limitan 5, 10;

es decir, sólo obtener 10 resultados de vuelta, a partir de la quinta. Han mirado alrededor en línea y sólo hacer mención de la parte superior que obviamente no es de mucha utilidad.

¿Fue útil?

Solución

FoxPro no tiene apoyo directo a una cláusula LIMIT. Se tiene "TOP nn", pero que sólo proporciona el "top-mayoría de los registros" dentro de un determinado porcentaje, e incluso que tiene una limitación de 32k registros devueltos (máximo).

Es posible que sea mejor vertido los datos como un archivo CSV, o si eso no es práctico (debido a problemas de tamaño), escribir un pequeño script FoxPro que genera automáticamente una serie de instrucciones BEGIN INSERT-(X10000) declaraciones -commit que vierten a una serie de archivos de texto. Por supuesto, se necesita un entorno de desarrollo de FoxPro para esto, así que esto no puede aplicarse a su situación ...

Otros consejos

Tome un vistazo a la RecNo () función.

Visual FoxPro no admite directamente LÍMITE. He utilizado la siguiente consulta para superar la limitación:     SELECT TOP 100 * from PEOPLE WHERE RECNO() > 1000 ORDER BY ID; donde 100 es el límite y 1000 es el desplazamiento.

Es muy fácil moverse cláusula LIMIT usando cláusula TOP; si se quiere extraer de un registro a otro _start _finish de un archivo llamado _test, que puede hacer:

[VFP]

** asumiendo _start <= _finish, si no se obtiene un error de cláusula de la parte superior

*

_finish = MIN (RECCOUNT ( '_ test'), _ acabado)

*

SELECT * FROM (SELECT TOP (_finish - _start + 1) * FROM (SELECT TOP _finish *, RECNO () AS _tempo DE ORDEN _test POR _tempo) xx ORDER BY _tempo DESC) yy ORDER BY _tempo

**

[/ VFP]

que tenía que convertir una base de datos de FoxPro a MySQL hace unos años. Lo que hice para solucionar este era añadir una columna de ID de incremento automático de la tabla de FoxPro y usar eso como la referencia de fila.

Así que entonces se podría hacer algo así.

select name, address from people where id >= 5 and id <= 10;

El Foxpro sql documentación no lo hace mostrar algo similar a limitar.

A continuación, adaptar esto a sus mesas. Me tomó como 2 minutos, hago esta waaaay con demasiada frecuencia.

N1 - grupo por lo que sea, y asegurarse de que tiene un máximo (ID), puede utilizar regnum () para hacer uno, ordenados correctamente

N2 - N1 se une el que el ID = Max Id de N1, mostrar el campo que desea de N2

A continuación, si desea unirse a otras tablas, puso en que todos los soportes y darle un alias e incluirla en una combinación.

Select N1.reference, N1.OrderNoteCount, N2.notes_desc LastNote
FROM
(select reference, count(reference) OrderNoteCount, Max(notes_key) MaxNoteId
from custnote 
where  reference != '' 
Group by reference
) N1
JOIN 
(
select reference, count(reference) OrderNoteCount, notes_key, notes_desc
from custnote 
where  reference != '' 
Group by reference, notes_key, notes_desc
) N2 ON N1.MaxNoteId = N2.notes_key

Para ampliar la respuesta de Eyvind me gustaría crear un programa para la función utiliza RecNo () para tirar de los registros dentro de un rango determinado, por ejemplo 10.000 registros.

A continuación, podría programación del ciclo a través de la mesa grande en pedazos de 10.000 registros a la vez y preformas su carga de datos en su base de datos MySQL.

Mediante el uso de la función RECNO () puede estar seguro de no insertar filas más de una vez, y que pueda comenzar nuevamente en un punto de conocimientos en el proceso de carga de datos. Que por que es uno mismo puede ser muy útil en el caso de que necesite para detener y reiniciar el proceso de carga.

En función del número de las filas devueltas y si está utilizando .NET Framework puede compensar / limitar la DataTable de la siguiente manera conseguido:

dataTable = dataTable.AsEnumerable().Skip(offset).Take(limit).CopyToDataTable();

Recuerde agregar las System.Data.DataSetExtensions Asamblea.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top