miércoles, 23 de abril de 2014

DBF a SQL Server

A continuación se muestra un programa en VFP, con el cual generamos un archivo CSV, así como la sentencia SQL para crear la tabla en SQL Server y la sentencia BULK INSERT para insertar los datos en la tabla generada.

SET DATE TO YMD

* Abrir la Tabla
USE ?
nameFields = ''
tableFields = ''
numFields = AFIELDS(arrFields)  

* Seleccionamos los archivos a generar
csvFile = PUTFILE("Archivo:",ALIAS(),"csv")
sqlFile = PUTFILE("Archivo:",ALIAS(),"sql")

FOR nCount = 1 TO numFields
nameFields = nameFields + arrFields(nCount,1) + ','

tableFields = tableFields + arrFields(nCount,1) + ' VARCHAR(MAX) NULL,' + CHR(13)
ENDFOR

nameFields = SUBSTR(nameFields, 1, LEN(nameFields)-1)
tableFields = SUBSTR(tableFields, 1, LEN(tableFields)-2)

* Generar CSV
COPY TO &csvFile FIELDS &nameFields DELIMITED WITH CHARACTER |

* Generar SQL
tableFields = 'CREATE TABLE [dbo].' + ALIAS() + '(' + tableFields + ') ON [PRIMARY]' + CHR(13) + "BULK INSERT dbo." + ALIAS() + " FROM '" + csvFile + "' WITH (FIELDTERMINATOR = '|')"

IF FILE(sqlFile) 
gnSqlFile = FOPEN(sqlFile,12) 
ELSE 
gnSqlFile = FCREATE(sqlFile)
ENDIF 

IF gnSqlFile < 0 
WAIT 'No se puede Abrir el Archivo' WINDOW NOWAIT 
ELSE 
=FWRITE(gnSqlFile, tableFields) 

* Crear Updates
FOR nCount = 1 TO numFields
nameFields = arrFields(nCount,1)
IF arrFields(nCount,2) = 'C'
updCommand = CHR(13) + 'UPDATE [dbo].' + ALIAS() + ' SET ' + nameFields + '=REPLACE(' + nameFields + ',' + "'" + '"' + "'" + ',' + "'')"
=FWRITE(gnSqlFile, updCommand) 
ENDIF
ENDFOR
ENDIF 

=FFLUSH(gnSqlFile)
=FCLOSE(gnSqlFile) 

CLOSE DATABASES ALL
CLOSE TABLES ALL
CLOSE ALL

El programa pedírá el nombre de archivo para el CSV, así como el archivo SQL a generar, luego pedirá la tabla de la cual se generará el archivo CSV.

P.D. Es la manera más rápida que he encontrado para importar datos desde FOX a SQL Server.

******************************  ACTUALIZACIÓN ******************************
Prg en VFP para importar a MySQL.

SET DATE TO YMD

* Abrir la Tabla
USE ?
nameFields = ''
tableFields = ''
numFields = AFIELDS(arrFields)  

* Seleccionamos los archivos a generar
csvFile = PUTFILE("Archivo:",ALIAS(),"csv")
sqlFile = PUTFILE("Archivo:",ALIAS(),"sql")

FOR nCount = 1 TO numFields
nameFields = nameFields + arrFields(nCount,1) + ','

tableFields = tableFields + arrFields(nCount,1) + ' VARCHAR(65535) NULL,' + CHR(13)
ENDFOR

nameFields = SUBSTR(nameFields, 1, LEN(nameFields)-1)
tableFields = SUBSTR(tableFields, 1, LEN(tableFields)-2)

* Generar CSV
COPY TO &csvFile FIELDS &nameFields DELIMITED WITH CHARACTER |

* Generar SQL
tableFields = 'CREATE TABLE ' + ALIAS() + '(' + tableFields + ') ENGINE=InnoDB DEFAULT CHARSET=utf8' + CHR(13) + CHR(13) 
tableFields = tableFields + "LOAD DATA LOCAL INFILE '" + STRTRAN(csvFile , '\', '/') + "' INTO TABLE " + ALIAS() + " FIELDS TERMINATED BY '|' ENCLOSED BY '" + '"' + "' LINES TERMINATED BY '\n' (" + nameFields + ");"

IF FILE(sqlFile) 
gnSqlFile = FOPEN(sqlFile,12) 
ELSE 
gnSqlFile = FCREATE(sqlFile)
ENDIF 

IF gnSqlFile < 0 
WAIT 'No se puede Abrir el Archivo' WINDOW NOWAIT 
ELSE 
=FWRITE(gnSqlFile, tableFields) 
ENDIF 

=FFLUSH(gnSqlFile)
=FCLOSE(gnSqlFile) 

CLOSE DATABASES ALL
CLOSE TABLES ALL
CLOSE ALL