¿Cómo copiar todos los registros de una tabla a otra?
Hola, explico lo que quiero hacer:
Código:
tabla-A
Ahora bien, le ponemos un campo más a tabla-B y queda así: Código:
tabla-B Uso Firebird 2.1 Edito: Tampoco quisiera hacer un for select porque tendría que declarar todos los campos, y sería un inconveniente cada vez que se modificara la tabla, habría que modificar también el store procedure. |
Hola
Una pregunta amigo: Siempre va a modificarse una de las tablas ?, me refiero a los campos. Saludos |
Hola Casimiro, cuando los campos son diferentes en las tablas, tienes que poner los que campos que coinciden con la tabla del Select, en tu ejemplo no entraría el Campo0 de tu tabla B.
Saluditos |
Anda, eso me lo apunto yo también.
Gracias. :D |
Cita:
Cita:
Lo ideal sería poder recorrer los campos, al igual que se puede hacer desde delphi. Pero bueno, tu idea es bastante cercana a lo que necesito, será lo que use si no se "nos" ocurre otra cosa :) |
Hola
En principio no se si se tendrá claro o no que la BD1 contiene los mismos campos que la BD2. Me imagino que lo que pretendes es que ese dato NO sea relevante, osea, que no importe si los campos son los mismos o no ya que el store procedure pretendes que siempre sea el mismo. CREO, que la mejor manera seria primero hacer una comprobación de los campos, de las dos BD, esto se puede hacer mas o menos asi:
Esto te mostrara los campos de cada tabla; Haciendo una comparación de los campos podrás crear tu sentencia, especificando el campo o los campos faltantes por medio de variables. Por cierto, para saber mas datos de las tablas:
Ya sabes, de esto no se, pero trato de aportarle algo a mi Maestro.;) Saludos |
¿Quién diría que eres un novato? ;)
Ambas tablas siempre se diferenciarán en un campo. Si una se modifica, entonces la otra también. Código:
tabla-A |
Hola
Sigo desubicado, para variar. Pregunto: 1- Son siempre iguales, salvo por un campo ? 2- Los campos van creciendo, osea, van aumentando en su numero. ?. Lo digo por que en principio pusiste 4 campos en la primera tabla y cinco en la segunda y hora pones mas. Ya sabes que poco ayudare, pero si pregunto tal vez a alguien se le encienda la bombilla.:D Saludos |
Bueno, me explico mejor, lo anterior era solamente un ejemplo, son dos tablas iguales salvo por un campo. Seguramente se ampliarán con el tiempo con el añadido de más campos porque se necesite hacer algo más.
En principio deben ser iguales salvo ese primer campo. O sea, 'casi' iguales :) Ahora mismo tiene 29 campos. Y lo que quiero conseguir es "olvidarme" de la misma el día que sea necesario añadir algún nuevo campo para controlar cualquier otra cosa, o sea, que dentro de unos meses, cuando ya te has olvidado de todo, no tenga que decir: "no se sabe por qué falla el programa", y después de mucho perder el tiempo: "el problema era que había que añadir el nuevo campo en un store procedure, y se nos había olvidado." Resumiendo, da igual los campos que tenga la tabla, lo que se intenta es no tener que controlarlo, que sea un proceso automático. Al igual que en delphi se puede hacer algo así como (de memoria):
|
Bueno, me voy a dormir, mañana sigo.
¡¡¡GRACIAS!!! :) |
Hola
Por eso pensé en que si se puede saber que campos tiene cada tabla y guardar los nombres en donde sea se puede usar la consulta que hizo caro, seria algo asi: Reviso los campos de cada tabla: Guardo los datos que como serán nombres de campos podrán ser string e inserto con los datos obtenidos usando la consulta de Caro: BD1/campos= dato1, dato2, dato3, dato4, dato5 BD2/campos= dato0, dato1, dato2, dato3, dato4, dato5 Me da la impresión de que la inserción de datos es mas fiable si se ponen los nombres de los campos. No se amigo, es solo una opinión sin mucha base; Bueno, sin base alguna.:D Saludos |
Hola
Vale amigo, mañana lo harás sin problemas, la almohada es la mejor consejera. Buenas Noches. Saludos |
Si la tabla no tiene muchos datos, tal vez te saldría a cuenta, dentro del Stored Procedure, añadir el campo0 a la primera tabla, luego hacer el INSERT INTO y finalmente volver a borrar el campo de la primera tabla.
La ventaja que le veo es que cuando añadas más campos, el SP no deberá cambiar. La desventaja es que si la tabla es muy grande (con muchos datos), habrá que ver el tiempo que tarda en crear y borrar el campo. |
Me da la sensación de que Caral es el que más cerca anda de la solución.
yo haría lo mismo que él, leería los campos de la tabla 1, y montaría la query en una variable de tipo string. Luego ejecutaría "EXCECUTE STATEMENT CONSULTA" siendo consulta la query que he montado. No lo he probado. Si funciona, no deberás cambiar nunca el store procedure. Saludos |
Hola, gracias por las respuestas.
Neftalí, la tabla tiene bastantes registros porque se tratan precisamente de históricos, la tabla-B es un histórico acumulado de todo lo que hay en tabla-A, así que como todos los históricos, cada vez será más y más grande. Aunque el método que has indicado es una muy buena idea, muy simple y efectiva. El método indicado por Caral de obtener los campos desde las tablas del sistema, luego crear la sentencia sql dinámicamente, como también ha indicado fjcg02, es muy factible, y también funciona, seguro. Lo que voy a hacer es probar ambas formas, me quedaré con la que sea más rápida de ejecución. Y si son muy similares... lo echaré a cara o cruz :) Gracias de nuevo, ambas soluciones son estupendas y es justo lo que estaba buscando. |
Bueno, pero, ¿qué valor debe ir en ese campo extra? Supongamos que es un campo entero y cero su valor por defecto. No me van a decir que en Firebird no puede hacerse esto:
// Saludos |
Hola
Muy interesante. Pregunto: Que campo de la tabla tomara para ese dato ?, el 1, 2, 3 etc..??. Saludos |
Hola Casimiro.
Cita:
Código:
SQL := 'insert into TablaB'(; |
Pues aparentemente no funciona de ese modo, es lo primero que probé :( |
Cita:
|
La franja horaria es GMT +2. Ahora son las 21:16:52. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi