Maven es una herramienta para administrar proyectos en Java, que nos permite descargar las dependencias que necesitemos de algún repositorio, por default: http://mvnrepository.com/, algunos comandos básicos son los siguientes:
Para crear un proyecto de tipo jar, ejecutamos el siguiente comando:
mvn archetype:generate -DgroupId=com.examples -DartifactId=Examples -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
Donde com.examples es el nombre del paquete que generará, con una clase App para iniciar la aplicación, y Examples es el nombre de nuestro proyecto. Este comando creará un archivo pom.xml que es el archivo de configuración de Maven.
Para instalar en nuestro repositorio local alguna dependencia que no podamos ubicar en el repositorio por default, podemos ejecutar el siguiente comando:
mvn install:install-file -Dfile=gtranslateapi-1.0.jar -Dpackaging=jar -DgroupId=com.gtranslate -DartifactId=gtranslateapi -Dversion=1.0
Donde gtranslateapi-1.0.jar es el jar a instalar com.gtranslate es el grupo al que pertenece y gtranslateapi es el nombre que se le da al artefacto.
Para generar un proyecto de Eclipse desde Maven podemos ejecutar el siguiente comando:
mvn eclipse:eclipse
Este comando crea el archivo de propiedades de Eclipse, así como el classpath de las dependencias que se indiquen en el archivo pom.xml.
Para compilar y generar el proyecto podemos ejecutar los siguientes comandos:
mvn compile
mvn package
Para generar la documentación del proyecto con javadoc:
mvn javadoc:javadoc
miércoles, 3 de diciembre de 2014
lunes, 3 de noviembre de 2014
Triggers DDL
Los triggers DDL se activan cuando se ejecuta una setencia DDL, como puede ser un ALTER TABLE, CREATE TABLE, etc. Por ejemplo, si quisieramos mantener nuestro codigo de Procedimiento Almacenados para que nadie pueda modificar, podemos crear el siguiente Trigger, es cual no permitirá alterar o borrar ningún Procedimiento Almacenado y funciones.
CREATE TRIGGER [TR_Rutinas]
ON DATABASE FOR alter_procedure, alter_function, drop_procedure, drop_function
AS
BEGIN
RAISERROR ('Unknow Error' , 16, 1)
ROLLBACK TRANSACTION
END
Cuando se pretenda modificar o borrar una rutina, lanzará Unknow Error.
Reparar Base de Datos SUSPECT
Recientemente tuvimos el problema de una Base de Datos en estado SUSPECT. Para recuperarla hay que ejecutar los siguientes comandos:
EXEC sp_resetstatus DB;
ALTER DATABASE DB SET EMERGENCY;
DBCC CHECKDB (DB) WITH NO_INFOMSGS, ALL_ERRORMSGS;
ALTER DATABASE DB SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
DBCC CHECKDB (DB, REPAIR_ALLOW_DATA_LOSS) WITH NO_INFOMSGS, ALL_ERRORMSGS;
ALTER DATABASE DAPA SET MULTI_USER;
Donde DB, es la Base de Datos a reparar. Robado de acá: http://support.managed.com/kb/a398/how-to-repair-a-suspect-database-in-mssql.aspx.
EXEC sp_resetstatus DB;
ALTER DATABASE DB SET EMERGENCY;
DBCC CHECKDB (DB) WITH NO_INFOMSGS, ALL_ERRORMSGS;
ALTER DATABASE DB SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
DBCC CHECKDB (DB, REPAIR_ALLOW_DATA_LOSS) WITH NO_INFOMSGS, ALL_ERRORMSGS;
ALTER DATABASE DAPA SET MULTI_USER;
Donde DB, es la Base de Datos a reparar. Robado de acá: http://support.managed.com/kb/a398/how-to-repair-a-suspect-database-in-mssql.aspx.
miércoles, 17 de septiembre de 2014
Generador de INSERT INTO
El siguiente procedimiento almacenado, surge como herramienta para importar datos de TABLAS entre diferentes Bases de Datos SQL Server, que se presumen tienen la misma estructura.
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: YoRcH
-- Create date: 19/06/2014
-- Description: Obtiene en Texto INSERT INTO para una tabla
-- =============================================
ALTER PROCEDURE [dbo].[usp_InsertInto]
@esquema NVARCHAR(255) = '',
@tabla NVARCHAR(255) = '',
@desdeBD NVARCHAR(255) = ''
AS
BEGIN
SET NOCOUNT ON;
DECLARE @cCampo VARCHAR(MAX)
DECLARE @cFields VARCHAR(MAX)
SET @cFields = ''
DECLARE Cur_Campos CURSOR LOCAL FORWARD_ONLY FOR
SELECT name
FROM sys.columns
WHERE object_id = OBJECT_ID(@esquema + '.' + @tabla)
AND is_computed = 0
OPEN Cur_Campos
FETCH Cur_Campos INTO @cCampo
WHILE (@@FETCH_STATUS = 0)
BEGIN
SET @cFields = @cFields + @cCampo + ','
FETCH Cur_Campos INTO @cCampo
END -- Fin del bucle WHILE
CLOSE Cur_Campos
DEALLOCATE Cur_Campos
-- SI TIENE IDENTITITY
PRINT 'BEGIN TRY'
PRINT ' TRUNCATE TABLE ' + @esquema + '.' + @tabla
PRINT 'END TRY'
PRINT 'BEGIN CATCH'
PRINT ' DELETE FROM ' + @esquema + '.' + @tabla
PRINT 'END CATCH'
IF EXISTS(SELECT NAME FROM sys.columns WHERE object_id = OBJECT_ID(@esquema + '.' + @tabla) and is_identity = 1) BEGIN
PRINT 'SET IDENTITY_INSERT ' + @esquema + '.' + @tabla + ' ON'
END
SET @cFields = SUBSTRING(@cFields,1, LEN(@cFields)-1)
PRINT 'INSERT INTO ' + @esquema + '.' + @tabla + '(' + @cFields + ')'
PRINT 'SELECT ' + @cFields + ' FROM ' + @desdeBD + '.' + @esquema + '.' + @tabla
IF EXISTS(SELECT NAME FROM sys.columns WHERE object_id = OBJECT_ID(@esquema + '.' + @tabla) and is_identity = 1) BEGIN
PRINT 'SET IDENTITY_INSERT ' + @esquema + '.' + @tabla + ' OFF'
END
PRINT ''
END
Ejemplo de Uso:
EXECUTE usp_InsertInto 'dbo','tabla','BD'
Donde: 'dbo' es el esquema, 'tabla' es la tabla que queremos llenar y 'BD' es la Base de Datos de donde se traerán los datos; el procedimiento regresa:
BEGIN TRY
TRUNCATE TABLE dbo.tabla
END TRY
BEGIN CATCH
DELETE FROM dbo.tabla
END CATCH
SET IDENTITY_INSERT dbo.tabla ON
INSERT INTO dbo.tabla(id_variable,descripcion,descripcion_larga,id_udm,id_modulo,id_systema,query,cantidad,valor,resultado,inactivo)
SELECT id_variable,descripcion,descripcion_larga,id_udm,id_modulo,id_systema,query,cantidad,valor,resultado,inactivo FROM BD.dbo.tabla
SET IDENTITY_INSERT dbo.tabla OFF
Estas líneas solamente se copian y pegan en el cliente de SQL Server y se ejecutan, si las tablas tienen la misma estructura, debe funcionar. Primero trata de truncar la tabla, si no puede entonces ejecuta un DELETE, si la tabla tiene un IDENTITY lo desactiva para luego ejecutar el INSERT INTO y posteriormente vuelve a activar el IDENTITY.
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: YoRcH
-- Create date: 19/06/2014
-- Description: Obtiene en Texto INSERT INTO para una tabla
-- =============================================
ALTER PROCEDURE [dbo].[usp_InsertInto]
@esquema NVARCHAR(255) = '',
@tabla NVARCHAR(255) = '',
@desdeBD NVARCHAR(255) = ''
AS
BEGIN
SET NOCOUNT ON;
DECLARE @cCampo VARCHAR(MAX)
DECLARE @cFields VARCHAR(MAX)
SET @cFields = ''
DECLARE Cur_Campos CURSOR LOCAL FORWARD_ONLY FOR
SELECT name
FROM sys.columns
WHERE object_id = OBJECT_ID(@esquema + '.' + @tabla)
AND is_computed = 0
OPEN Cur_Campos
FETCH Cur_Campos INTO @cCampo
WHILE (@@FETCH_STATUS = 0)
BEGIN
SET @cFields = @cFields + @cCampo + ','
FETCH Cur_Campos INTO @cCampo
END -- Fin del bucle WHILE
CLOSE Cur_Campos
DEALLOCATE Cur_Campos
-- SI TIENE IDENTITITY
PRINT 'BEGIN TRY'
PRINT ' TRUNCATE TABLE ' + @esquema + '.' + @tabla
PRINT 'END TRY'
PRINT 'BEGIN CATCH'
PRINT ' DELETE FROM ' + @esquema + '.' + @tabla
PRINT 'END CATCH'
IF EXISTS(SELECT NAME FROM sys.columns WHERE object_id = OBJECT_ID(@esquema + '.' + @tabla) and is_identity = 1) BEGIN
PRINT 'SET IDENTITY_INSERT ' + @esquema + '.' + @tabla + ' ON'
END
SET @cFields = SUBSTRING(@cFields,1, LEN(@cFields)-1)
PRINT 'INSERT INTO ' + @esquema + '.' + @tabla + '(' + @cFields + ')'
PRINT 'SELECT ' + @cFields + ' FROM ' + @desdeBD + '.' + @esquema + '.' + @tabla
IF EXISTS(SELECT NAME FROM sys.columns WHERE object_id = OBJECT_ID(@esquema + '.' + @tabla) and is_identity = 1) BEGIN
PRINT 'SET IDENTITY_INSERT ' + @esquema + '.' + @tabla + ' OFF'
END
PRINT ''
END
Ejemplo de Uso:
EXECUTE usp_InsertInto 'dbo','tabla','BD'
Donde: 'dbo' es el esquema, 'tabla' es la tabla que queremos llenar y 'BD' es la Base de Datos de donde se traerán los datos; el procedimiento regresa:
BEGIN TRY
TRUNCATE TABLE dbo.tabla
END TRY
BEGIN CATCH
DELETE FROM dbo.tabla
END CATCH
SET IDENTITY_INSERT dbo.tabla ON
INSERT INTO dbo.tabla(id_variable,descripcion,descripcion_larga,id_udm,id_modulo,id_systema,query,cantidad,valor,resultado,inactivo)
SELECT id_variable,descripcion,descripcion_larga,id_udm,id_modulo,id_systema,query,cantidad,valor,resultado,inactivo FROM BD.dbo.tabla
SET IDENTITY_INSERT dbo.tabla OFF
Estas líneas solamente se copian y pegan en el cliente de SQL Server y se ejecutan, si las tablas tienen la misma estructura, debe funcionar. Primero trata de truncar la tabla, si no puede entonces ejecuta un DELETE, si la tabla tiene un IDENTITY lo desactiva para luego ejecutar el INSERT INTO y posteriormente vuelve a activar el IDENTITY.
Parsear Fórmulas o Queries en SQL Server 2008
Este Procedimiento Almacenado, parsea una formula o ejecuta un query y regresa el resultado en un decimal, en caso de que no pueda parsear o ejecutar el comando, regresará NULL.
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: YoRcH
-- Create date: 25 JUN 2010
-- Description: Parsear Formulas para Nomina
-- =============================================
ALTER PROCEDURE [Global].[usp_parseFormula]
@CFORMULA NVARCHAR(MAX)
,@CXML NVARCHAR(MAX)
,@nResultado DECIMAL(12,2) OUTPUT
AS
BEGIN
DECLARE @CVARIABLE AS VARCHAR(MAX)
DECLARE @NVALOR AS DECIMAL(12,2)
DECLARE @nXmlDoc INT
DECLARE @Parametros NVARCHAR(255)
DECLARE @rc INT
SET @CXML = '' + @CXML + ' ' -- CERRAR TABLA DE VARIABLES XML
-- Cargar XML de Variables
EXEC sp_xml_preparedocument @nXmlDoc OUTPUT, @CXML
BEGIN TRY
-- Crear Cursor
DECLARE Cur_Variables CURSOR LOCAL FORWARD_ONLY FOR
SELECT VARIABLE, VALOR
FROM OPENXML (@nXmlDoc, '/ROOT/TVARIABLES',2)
WITH (VARIABLE varchar (255), VALOR DECIMAL(12,2))
OPEN Cur_Variables
FETCH Cur_Variables INTO @CVARIABLE, @NVALOR
WHILE (@@FETCH_STATUS = 0) BEGIN -- Ciclo de Variables
SET @CFORMULA = REPLACE (@CFORMULA, @CVARIABLE, @NVALOR)
FETCH Cur_Variables INTO @CVARIABLE, @NVALOR
END
CLOSE Cur_Variables
DEALLOCATE Cur_Variables
SET @Parametros = '@nResultado DECIMAL(12,2) OUTPUT';
SET @CFORMULA = 'SELECT @nResultado = (' + @CFORMULA + ')'
SET @CFORMULA = REPLACE (@CFORMULA, '--', '+') -- QUITAR SIGNOS DE -
-- Parsear Formula
BEGIN TRY
EXEC @rc = sp_executesql @CFORMULA, @Parametros, @nResultado OUTPUT;
IF @rc <> 0 BEGIN
SET @nResultado = NULL
END
END TRY
BEGIN CATCH
SET @nResultado = NULL
END CATCH
END TRY
BEGIN CATCH
SET @nResultado = NULL
END CATCH
EXECUTE sp_xml_removedocument @nXmlDoc
END -- SP
Ejemplo de Uso:
DECLARE @RC int
DECLARE @CFORMULA nvarchar(max)
DECLARE @CXML nvarchar(max)
DECLARE @nResultado decimal(12,2)
DECLARE @tVariables Table (VARIABLE varchar (255), VALOR DECIMAL(12,2))
INSERT INTO @tVariables VALUES ('W', 2)
INSERT INTO @tVariables VALUES ('X', -2)
INSERT INTO @tVariables VALUES ('Y', -3)
INSERT INTO @tVariables VALUES ('Z', 5)
-- PASAR TABLA A XML
SET @CXML = (SELECT VARIABLE
,VALOR
FROM @tVariables AS TVARIABLES
FOR XML AUTO, ELEMENTS)
EXECUTE @RC = [Global].[usp_parseFormula] '(X-Y-Z-W)*-W', @CXML, @nResultado OUTPUT
SELECT @nResultado AS RESULTADO
El resultado es 12.00.
Solo se debe definir una nomenclatura correcta para los nombre de las variables, para que no se traslapen con nombres de columnas o funciones.
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: YoRcH
-- Create date: 25 JUN 2010
-- Description: Parsear Formulas para Nomina
-- =============================================
ALTER PROCEDURE [Global].[usp_parseFormula]
@CFORMULA NVARCHAR(MAX)
,@CXML NVARCHAR(MAX)
,@nResultado DECIMAL(12,2) OUTPUT
AS
BEGIN
DECLARE @CVARIABLE AS VARCHAR(MAX)
DECLARE @NVALOR AS DECIMAL(12,2)
DECLARE @nXmlDoc INT
DECLARE @Parametros NVARCHAR(255)
DECLARE @rc INT
SET @CXML = '
-- Cargar XML de Variables
EXEC sp_xml_preparedocument @nXmlDoc OUTPUT, @CXML
BEGIN TRY
-- Crear Cursor
DECLARE Cur_Variables CURSOR LOCAL FORWARD_ONLY FOR
SELECT VARIABLE, VALOR
FROM OPENXML (@nXmlDoc, '/ROOT/TVARIABLES',2)
WITH (VARIABLE varchar (255), VALOR DECIMAL(12,2))
OPEN Cur_Variables
FETCH Cur_Variables INTO @CVARIABLE, @NVALOR
WHILE (@@FETCH_STATUS = 0) BEGIN -- Ciclo de Variables
SET @CFORMULA = REPLACE (@CFORMULA, @CVARIABLE, @NVALOR)
FETCH Cur_Variables INTO @CVARIABLE, @NVALOR
END
CLOSE Cur_Variables
DEALLOCATE Cur_Variables
SET @Parametros = '@nResultado DECIMAL(12,2) OUTPUT';
SET @CFORMULA = 'SELECT @nResultado = (' + @CFORMULA + ')'
SET @CFORMULA = REPLACE (@CFORMULA, '--', '+') -- QUITAR SIGNOS DE -
-- Parsear Formula
BEGIN TRY
EXEC @rc = sp_executesql @CFORMULA, @Parametros, @nResultado OUTPUT;
IF @rc <> 0 BEGIN
SET @nResultado = NULL
END
END TRY
BEGIN CATCH
SET @nResultado = NULL
END CATCH
END TRY
BEGIN CATCH
SET @nResultado = NULL
END CATCH
EXECUTE sp_xml_removedocument @nXmlDoc
END -- SP
Ejemplo de Uso:
DECLARE @RC int
DECLARE @CFORMULA nvarchar(max)
DECLARE @CXML nvarchar(max)
DECLARE @nResultado decimal(12,2)
DECLARE @tVariables Table (VARIABLE varchar (255), VALOR DECIMAL(12,2))
INSERT INTO @tVariables VALUES ('W', 2)
INSERT INTO @tVariables VALUES ('X', -2)
INSERT INTO @tVariables VALUES ('Y', -3)
INSERT INTO @tVariables VALUES ('Z', 5)
-- PASAR TABLA A XML
SET @CXML = (SELECT VARIABLE
,VALOR
FROM @tVariables AS TVARIABLES
FOR XML AUTO, ELEMENTS)
EXECUTE @RC = [Global].[usp_parseFormula] '(X-Y-Z-W)*-W', @CXML, @nResultado OUTPUT
SELECT @nResultado AS RESULTADO
El resultado es 12.00.
Solo se debe definir una nomenclatura correcta para los nombre de las variables, para que no se traslapen con nombres de columnas o funciones.
miércoles, 16 de julio de 2014
Ejecutar Comando del Sistema con MySQL
MySQL no cuenta con una función para ejecutar algún comando del Sistema Operativo, pero se puede hacer con una implementacion de UDF, lo único que necesitamos hacer en Windows es mover la librería lib_mysqludf_sys.dll (en linux: lib_mysqludf_sys.so) al directorio de MYSQL\lib\plugin, y crear la función externa de la siguiente manera:
CREATE FUNCTION sys_exec RETURNS integer SONAME 'lib_mysqludf_sys.dll';
Ahora ya podemos utilizar la función:
SELECT sys_exec("mkdir folder");
Creará un folder en el directorio de data de MySQL.
La librería se puede descargar de : https://drive.google.com/folderview?id=0B1eEHBrSu7acYnNkSVR3cEp5ejg&usp=sharing.
CREATE FUNCTION sys_exec RETURNS integer SONAME 'lib_mysqludf_sys.dll';
Ahora ya podemos utilizar la función:
SELECT sys_exec("mkdir folder");
Creará un folder en el directorio de data de MySQL.
La librería se puede descargar de : https://drive.google.com/folderview?id=0B1eEHBrSu7acYnNkSVR3cEp5ejg&usp=sharing.
viernes, 11 de julio de 2014
Crear Folder en SQL Server
Podemos crear un folder con OLE Automation, de la siguiente manera:
DECLARE @OLEresult INT
DECLARE @OLEfilesytemobject INT
DECLARE @OLEfolder INT
DECLARE @OLEsource VARCHAR(255)
DECLARE @OLEdescription VARCHAR(255)
DECLARE @newfolder VARCHAR(255)
SET @newfolder = 'C:\Backups\New_Folder'
EXEC @OLEresult=sp_OACreate 'Scripting.FileSystemObject', @OLEfilesytemobject OUT
IF @OLEresult <> 0 BEGIN
EXEC sp_OAGetErrorInfo @OLEfilesytemobject
RETURN
END
EXEC @OLEresult=sp_OAMethod @OLEfilesytemobject, 'FolderExists', @OLEfolder OUT, @newfolder
IF @OLEfolder=0 BEGIN
EXEC @OLEresult=sp_OAMethod @OLEfilesytemobject, 'CreateFolder', @OLEfolder OUT, @newfolder
END
IF @OLEresult <> 0 BEGIN
EXEC sp_OAGetErrorInfo @OLEfilesytemobject, @OLEsource OUT, @OLEdescription OUT
SELECT @OLEdescription='Could not create folder: ' + @OLEdescription
RAISERROR (@OLEdescription, 16, 1)
END
EXECUTE @OLEResult = sp_OADestroy @OLEfilesytemobject
DECLARE @OLEresult INT
DECLARE @OLEfilesytemobject INT
DECLARE @OLEfolder INT
DECLARE @OLEsource VARCHAR(255)
DECLARE @OLEdescription VARCHAR(255)
DECLARE @newfolder VARCHAR(255)
SET @newfolder = 'C:\Backups\New_Folder'
EXEC @OLEresult=sp_OACreate 'Scripting.FileSystemObject', @OLEfilesytemobject OUT
IF @OLEresult <> 0 BEGIN
EXEC sp_OAGetErrorInfo @OLEfilesytemobject
RETURN
END
EXEC @OLEresult=sp_OAMethod @OLEfilesytemobject, 'FolderExists', @OLEfolder OUT, @newfolder
IF @OLEfolder=0 BEGIN
EXEC @OLEresult=sp_OAMethod @OLEfilesytemobject, 'CreateFolder', @OLEfolder OUT, @newfolder
END
IF @OLEresult <> 0 BEGIN
EXEC sp_OAGetErrorInfo @OLEfilesytemobject, @OLEsource OUT, @OLEdescription OUT
SELECT @OLEdescription='Could not create folder: ' + @OLEdescription
RAISERROR (@OLEdescription, 16, 1)
END
EXECUTE @OLEResult = sp_OADestroy @OLEfilesytemobject
lunes, 7 de julio de 2014
Consumir RESTFul en SQL Server
Primero tenemos que activar Ole Automation Procedures con las siguientes lineas:
-- HABILITAR Ole Automation Procedures
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO
Después creamos un objeto MSXML2.XMLHTTP al que se le asigna una URL y un método GET, de la siguiente manera:
DECLARE @Object INT
DECLARE @ResponseText VARCHAR(255)
DECLARE @url VARCHAR(MAX)
SET @url = 'http://freegeoip.net/json/189.158.46.223'
EXEC sp_OACreate 'MSXML2.XMLHTTP', @Object OUT;
EXEC sp_OAMethod @Object, 'open', NULL, 'get', @url, 'false'
EXEC sp_OAMethod @Object, 'send'
EXEC sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT
SELECT @ResponseText AS RESPONSE
EXEC sp_OADestroy @Object
-- HABILITAR Ole Automation Procedures
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO
Después creamos un objeto MSXML2.XMLHTTP al que se le asigna una URL y un método GET, de la siguiente manera:
DECLARE @Object INT
DECLARE @ResponseText VARCHAR(255)
DECLARE @url VARCHAR(MAX)
SET @url = 'http://freegeoip.net/json/189.158.46.223'
EXEC sp_OACreate 'MSXML2.XMLHTTP', @Object OUT;
EXEC sp_OAMethod @Object, 'open', NULL, 'get', @url, 'false'
EXEC sp_OAMethod @Object, 'send'
EXEC sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT
SELECT @ResponseText AS RESPONSE
EXEC sp_OADestroy @Object
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
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
Suscribirse a:
Entradas (Atom)