Leer datos de una tabla DBF en SQL Server

Mar 26, 2012 21 Comments by

A veces, en procesos de migración de sistema, es necesario importar datos de un antiguo DBF (muy común en entornos Visual Foxpro) a SQL Server. Hay varias formas, una de ellas, es a través de la sentencia OPENROWSET en SQL Server.

Primero es necesario habilitar dos opciones en nuestra instancia de SQL Server, “show advanced options” y “Ad Hoc Distributed Queries”. El siguiente query habilita las opciones.

sp_configure 'show advanced options', 1
reconfigure
go
exec sp_configure 'Ad Hoc Distributed Queries',1
go
reconfigure
go

Una vez habilitadas, podemos utilizar OPENROWSET para obtener datos de otras fuentes, en el ejemplo, datos de un archivo DBF.

-- El archivo se encuentra en c:\work\tabla.dbf
select * from OPENROWSET
('MICROSOFT.JET.OLEDB.4.0','dBase IV;HDR=NO;IMEX=2;
DATABASE=C:\work\','select * from TABLA.DBF')

Si es necesario insertar estos datos en una tabla específica, solo debemos usar la sentencia insert into, ejemplo.


INSERT INTO tabla
select * from OPENROWSET
('MICROSOFT.JET.OLEDB.4.0','dBase IV;HDR=NO;IMEX=2;
DATABASE=C:\work\','select CAMPO1,CAMPO2,CAMPO3 from TABLA.DBF')
Databases

About the author

Ingeniero en Informática, Oracle Certified Master Java EE 6 Enterprise Architect, Oracle Certified Professional Java Programmer. Experto en distintas ramas de la computación y otras "yerbas" xD. Si te gusto este post, sígueme en @deerme_org, escríbeme a info AT deerme.org o contactame por linkedin.

21 Responses to “Leer datos de una tabla DBF en SQL Server”

  1. eduardo says:

    Hola me genera un eeror de servidor vinculado y clomuna null

  2. eduardo says:

    aqkguien me puede ayudar necesito migrar datos de tablas .dbf a sql server

  3. deerme.org says:

    Eduardo, recuerda primero habilitar las opciones en el servidor, con algún usuario que tenga permisos (idealmente sa).

    Luego de eso, prueba OPENROWSET, fíjate que debes indicar la ruta de la carpeta del archivo en DATABASE y en el query la tabla es el archivo .DBF.

    Saludos

  4. Oliver says:

    hola intente utilizar tu codigo tengo el usuario sa y le puse la ruta y me sale el siguiente mensaje

    Msg 7308, Level 16, State 1, Line 1
    OLE DB provider ‘MICROSOFT.JET.OLEDB.4.0′ cannot be used for distributed queries because the provider is configured to run in single-threaded apartment mode.

  5. deerme.org says:

    Hola Oliver

    Sucede que hay que configurar unos parametros antes, antes de que ejecutar la setencia select que el archivo, debes ejecutar estos querys con algun usuario con permisos privilegiados en la instancia.

    sp_configure 'show advanced options', 1
    reconfigure
    go
    exec sp_configure 'Ad Hoc Distributed Queries',1
    go
    reconfigure
    go

    Una ves que los ejecutes, luego podrás usar OPENROWSET.

    Suerte!!

    • Néstor says:

      indistintamente de dichos queries con usuario privilegiado, el problema es persistente:

      OLE DB provider ‘MICROSOFT.JET.OLEDB.4.0′ cannot be used for distributed queries because the provider is configured to run in single-threaded apartment mode.

      • Brosnan says:

        Me sucede lo msmo, aparte al ejecutar las lineas: sp_configure ‘show advanced options’, 1
        reconfigure
        go
        exec sp_configure ‘Ad Hoc Distributed Queries’,1
        go
        reconfigure
        go
        me envia un mensaje:
        Se ha cambiado la opción de configuración ‘show advanced options’ de 1 a 1. Ejecute la instrucción RECONFIGURE para instalar.
        Se ha cambiado la opción de configuración ‘Ad Hoc Distributed Queries’ de 1 a 1. Ejecute la instrucción RECONFIGURE para instalar.

        ejecuto esa instruccion y aun no sfunciona

    • Marivel says:

      Hola, yo ya ejecute la consulta con el usuario SA y genere la consulta. pero me sale error : Msg 7308, Level 16, State 1, Line 2
      OLE DB provider ‘MICROSOFT.JET.OLEDB.4.0′ cannot be used for distributed queries because the provider is configured to run in single-threaded apartment mode.

  6. Hermilo says:

    Hola buenos días, Tengo un problema al querer ejecutar la consulta =/
    escribí el código tal como se ve en tu ejemplo pero me aparece el error:

    “No se puede procesar el objeto “select *from usuarios.dbf”. El Proveedor OLE DB “Microsoft.JET.OLEDB.4.0″ del servidor vinculado “(null)” indica que el objeto no tiene columnas o el usuario actual no tiene permisos en ese objeto”

    instale ya un driver que vi que necesitaria de visual fox pero quiciera saber si puedes ayudarme a resolver este problema.

    Muchas gracias de antemano

  7. Nelson says:

    Realmente no funciona correctamente tu ejemplo. Me puedes ayudar

  8. Christian says:

    Me da un error:

    El proveedor OLE DB ‘MICROSOFT.JET.OLEDB.4.0′ no puede usarse para consultas distribuidas porque está configurado para ejecutarse en el modo de subprocesamiento controlado simple.

    Qué debo instalar o configurar adicional? :(

  9. Alex Encarnacion says:

    encontre la solucion.
    a mi me daba el mismo error.
    pero en otra pc. lo logre realizar sin ningun problema.

    — la solucion es que lo corran con el sa. del sql server.
    no con el autentificador del windows.

    hagan eso y le funcionara…

    atte.

  10. José Luis says:

    Tu código me funcionó…. CORRECTAMENTE!
    Mil gracias.

  11. LeeSoft says:

    Hola

    Trate de todas las formas pero no resulta, si pudieras enviar o mostrar otras formas te agradeceria

  12. Daniel says:

    Buenas Tardes, quería saber si resulta necesario enumerar campo por campo del dbf o si solamente diciendo dbf origen tabla destino también se puede? Gracias por tu aporte

  13. César says:

    Excelente aporte!!! Sirvio de mucho

  14. Christian Falcones says:

    Hola estoy tratando de migrar unas tablas y me da el siguiente error de podra tratarse
    Mens. 7302, Nivel 16, Estado 1, Línea 1
    No se puede crear una instancia del proveedor OLE DB “MICROSOFT.JET.OLEDB.4.0″ para el servidor vinculado “(null)”.

  15. Mario Garcia says:

    Disculpa, puse otra cosa antes.

    Me aparece

    Servidor: mensaje 7302, nivel 16, estado 1, línea 1
    Cannot create an instance of OLE DB provider “MICROSOFT.JET.OLEDB.4.0″ for linked server “(null)”.

    No será necesario agregar el driver antes ????
    Por favor me interesa mucho

  16. NCcapa says:

    ES POR LA VERSION DE SQL SERVER,

  17. Ricky says:

    es por arquitectura tiene que ser de 32bit el sql server

Leave a Reply


6 + = fifteen