Visual Basic Foro
Programación => Bases de Datos => Mensaje iniciado por: Jeronimo en Agosto 21, 2014, 07:29:20 pm
-
Hola.
Necesito hacer una inserción de datos en una tabla de una base de datos SQLServer 2005 partiendo de una consulta en una tabla de una base de datos MySQL. De manera burda ejemplifico lo que intento hacer:
INSERT INTO tablasqlserver (campo1, campo2, campo3) (SELECT campo1, campo2, campo3 FROM tablamysql)¿Es posible hacerlo?
Muchas gracias.
Jerónimo
-
Hola.
Necesito hacer una inserción de datos en una tabla de una base de datos SQLServer 2005 partiendo de una consulta en una tabla de una base de datos MySQL. De manera burda ejemplifico lo que intento hacer:
INSERT INTO tablasqlserver (campo1, campo2, campo3) (SELECT campo1, campo2, campo3 FROM tablamysql)¿Es posible hacerlo?
Muchas gracias.
Jerónimo
Buenas,
Primero que nada estamos hablando de dos gestores diferentes, es decir, desde sql server no veo las tablas de mysql y tampoco viseversa... Por lo cual no se puede... Mi recomendación es, ejecutas la consulta en MySQL, exporta los valores a Excel y luego copia y pegalos en SQL Server....
Saludos
-
Utiliza los asistentes de SQL server para importar datos desde origenes ODBC (y ahi buscas MySQL, debes tener el conector previamente instalado)
-
Claro, iba a hacer eso, o poner los datos extraídos en un archivo de texto plano para luego tomarlos y ponerlos dentro de la base de datos SQL Server. Pero no sabía si había manera de relacionar dos bases de datos de motores diferentes.
Lo que tengo pensado es poner lo siguiente en un archivo de texto:
(valorA1, valorA2, valorA3), (valorB1, valorB2, valorB3)...Luego tomaría el contenido del archivo de texto en una variable, por ejemplo, Datos, para finalizar haciendo esto:
"INSERT INTO tablasqlserver (campo1, campo2, campo3) VALUES " & Datos¿Sabés si hay alguna limitación en cuanto a la cantidad de registros que se puedan insertar en una instrucción así?
Muchas gracias.
Jerónimo
-
Raul338: el problema es que no tengo acceso a la base de datos en sí, porque no es mía (la de MySQL sí lo es). Solo me hicieron un usuario con permisos para poder insertar datos, consultar y alguna otra cuestión sencilla.
Muchas gracias.
Jerónimo
-
Yo usaria una de estas dos opciones.
1.- En VB6 hago las dos conexiones. Con un rs.db1 leo de un motor y con rs.db2 inserto en el otro motor, sin necesidad de pasar por grillas ni nada, todo en memoria.
o'
2.- Usar el ESF Database Convert y con ella pasar esa sola tabla del motor X al motor Y y fin.
-
Yván: En tu sugerencia 1, ¿cómo decís que pase los datos de una bd a la otra? ¿Recorriendo el rs.db1 e insertando en db2 por cada iteración? ¿Recorriendo el rs.db1 y guardando los datos en alguna variable para luego insertar todos los datos "de un saque" en la db2? ¿Otra?
La opción 2 casi la descartaría, aunque no conozco bien qué es el ESF Database Convert, porque me huele (reitero que no lo conozco) que es un procedimiento que sería engorroso automatizar y ejecutar en forma habitual. ¿Es así?
Muchas gracias.
Jerónimo
-
1.- Si, me referia a un insert por iteracion, naturalmente con el commit al final.
2.- Al contrario el ESF convert es mas rapido , alli en mi blog (http://vb6firebird.com/blog/?p=268) hice una demo sobre eso. No es un software free, por tanto esa pregunta que me quieres (en) hacer por inbox.
-
1) Es que pueden ser 8000 registros. Preferiría ver si se puede hacer en un solo paso. Si no, en última instancia, lo haría así.
2) Voy a ver el video en un ratito y seguramente te mande un MP.
Muchas gracias.
Jerónimo
-
8000?... pense que era 800,000 como para preocuparnos jeje. Papa, 8000 no es nada, corren al toque encima si el insert no tiene calculos previos, leer y grabar los 8000 lo hace en menos de lo que piensa cantar un gallo.
-
¡Excelente!
Mañana voy a probar así, entonces.
¡Muchas gracias a todos!
Jerónimo
-
Estimado Jeronimo
A tú pregunta, la respuesta es SI es posible.
A partir de Microsoft SQL Server 2005, en adelante, se de dispone del concepto de Servidores Vinculados lo cual te permite agregar (vincular) una base de datos externa, incluso de un manejador de base de datos distinto a Microsoft SQL Server (MySQL, Oracle, etc.) a Microsoft SQL Server haciéndolo accesible, con esto puedo hacer todo tipo de consultas tipo Transac SQL.
Este es un ejemplo de un sentencia SQL para servidores vinculados
select * from openquery (LINKED_MYSQL,'select * from MiTabla')
Aquí te dejo un paso a paso para que puedas tener tú primer ServidorVinculado: http://1drv.ms/1ACWVas (http://1drv.ms/1ACWVas)
Saludos desde algún lugar de Lima-Perú
-
Ah mira que interesante, desconocía ese método, buen dato Albertomi como siempre.
Saludos
-
Qué bueno está eso, realmente muy interesante.
Lamentablemente no puedo ponerlo en práctica porque no tengo acceso al servidor (es de otra empresa), solo crearon un usuario con permisos muy limitados para que inserte datos desde afuera. Pero seguramente más adelante se avance sobre ese terreno.
Muchas gracias.
Jerónimo
-
Estimado Jeronimo
A tú pregunta, la respuesta es SI es posible.
A partir de Microsoft SQL Server 2005, en adelante, se de dispone del concepto de Servidores Vinculados lo cual te permite agregar (vincular) una base de datos externa, incluso de un manejador de base de datos distinto a Microsoft SQL Server (MySQL, Oracle, etc.) a Microsoft SQL Server haciéndolo accesible, con esto puedo hacer todo tipo de consultas tipo Transac SQL.
Este es un ejemplo de un sentencia SQL para servidores vinculados
select * from openquery (LINKED_MYSQL,'select * from MiTabla')
Aquí te dejo un paso a paso para que puedas tener tú primer ServidorVinculado: http://1drv.ms/1ACWVas (http://1drv.ms/1ACWVas)
Saludos desde algún lugar de Lima-Perú
Interesante, pensé que solo era posible en 2008R2...
Excelente dato Albertomi...!
Un puntacho por eso...!
-
No se mucho de vb6 pero en vb.net es facil.
Solo haces un DataTable de MySQL y de hay lo haces con un select del datatable.
Aqui un link donde explica como: http://blogtigrupordas.wordpress.com/2012/07/02/consulta-detro-de-un-datatable-en-vb-net/
incluso puedes usar la sentencia Using para descartala rapido
Using TablaEmpresa As DataTable = Datos.Consultar(vSQL)
End Using
Pero no se si se puede hacer un datatable en vb6 o exista algo parecido a una tabla virtual, que seria más facil que hacer un vinculo de un motor a otro.
En todo caso yo opto por usar una herramienta externa para jalar la información, pero si no pudiera usar un datatable claro.
-
Mmm... la verdad, no conozco ese tema. Pero finalmente lo hice con un bucle y una inserción por cada iteración y anduvo bastante bien: casi 6000 registros en 8-10 segundos.
Por ahora, así me sirve. Igualmente, si surgiera una manera mejor, la implementaría gustoso :D
Muchas gracias.
Jerónimo
-
¿Porque demoro tanto? quiza no me explique bien pero la lectura de los 6000 es en una y esta se conseva en un rs, esta lectura puede ser lenta si no estan bien creados los indices. Ahora, ese rs lo usas para insertar en la BD destino.
Yo tardo +/- ese tiempo porque en cada inserción hago una operación, pero entendí que en tu caso era solo leer y luego insertar sin mas.
En todo caso como vemos... opciones de solución hay muchas eh.
-
Efectivamente, Yván, seguramente tengo errores de diseño de la base de datos. Por eso tarda unos segundos (en este caso, 4 o 5) en traer los datos al recordset. Pero el tiempo que comenté fue lo que se tardó en recorrer todo el recordset y hacer las inserciones. Ahí ya no sé por qué puede ser que haya tardado tanto. A lo mejor exageré y fueron 6 segundos. De todas maneras, no resulta inconveniente ese tiempo. Aunque si pudiera mejorarlo lo haría, no tanto por el tiempo que se ahorre, sino porque significará que las cosas están bien hechas.
Muchas gracias.
Jerónimo
-
Para tener seguridad seguiria este esquema.
Begintranss
leer bd
for i to finDelRS
insertar
rs.movenext
next i
CommitTrans
Y allí si estaría seguro que todo se inserto
-
Eso mismo hago. Tengo plena seguridad de que se inserta todo lo que necesito y envío. Así que eso no me preocupa. Sí me preocupa que decís que debiera tardar menos tiempo. Bah, me gustaría optimizar el proceso.
Muchas gracias.
Jerónimo