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.
miércoles, 16 de julio de 2014
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
miércoles, 11 de septiembre de 2013
Bulk Insert con CSV
Ejemplo de Bulk Insert con SQL Server 2008.
CREATE TABLE tmpCSV (cuenta varchar (24), p1 NUMERIC(12,2), p2 NUMERIC(12,2), p3 NUMERIC(12,2), p4 NUMERIC(12,2), p5 NUMERIC(12,2), p6 NUMERIC(12,2),
p7 NUMERIC(12,2), p8 NUMERIC(12,2), p9 NUMERIC(12,2), p10 NUMERIC(12,2), p11 NUMERIC(12,2), p12 NUMERIC(12,2))
BULK INSERT tmpCSV FROM 'D:\Desarrollo.NET\Presupuesto.csv' WITH (FIELDTERMINATOR = ',')
SELECT * FROM tmpCSV
DROP TABLE tmpCSV
Donde el archivo debe tener la estructura correcta.
310500607010102,100,100,100,100,100,100,100,100,100,100,100,100
310500607020101,100,100,100,100,100,100,100,100,100,100,100,100
310500607020102,100,100,100,100,100,100,100,100,100,100,100,100
310500607030101,100,100,100,100,100,100,100,100,100,100,100,100
CREATE TABLE tmpCSV (cuenta varchar (24), p1 NUMERIC(12,2), p2 NUMERIC(12,2), p3 NUMERIC(12,2), p4 NUMERIC(12,2), p5 NUMERIC(12,2), p6 NUMERIC(12,2),
p7 NUMERIC(12,2), p8 NUMERIC(12,2), p9 NUMERIC(12,2), p10 NUMERIC(12,2), p11 NUMERIC(12,2), p12 NUMERIC(12,2))
BULK INSERT tmpCSV FROM 'D:\Desarrollo.NET\Presupuesto.csv' WITH (FIELDTERMINATOR = ',')
SELECT * FROM tmpCSV
DROP TABLE tmpCSV
Donde el archivo debe tener la estructura correcta.
310500607010102,100,100,100,100,100,100,100,100,100,100,100,100
310500607020101,100,100,100,100,100,100,100,100,100,100,100,100
310500607020102,100,100,100,100,100,100,100,100,100,100,100,100
310500607030101,100,100,100,100,100,100,100,100,100,100,100,100
miércoles, 7 de agosto de 2013
Ejemplos de UNPIVOT
-- Horizontal
SELECT cuenta, agua, saneamto, tratamto, otros, multa, recargos
FROM dbo.FACTURA
WHERE cuenta > 0
-- Vertical
SELECT CUENTA, CONCEPTO, IMPORTE
FROM
(SELECT cuenta, agua, saneamto, tratamto, otros, multa, recargos
FROM dbo.FACTURA
WHERE cuenta > 0) p
UNPIVOT
(IMPORTE FOR CONCEPTO IN
(agua, saneamto, tratamto, otros, multa, recargos)
)AS unpvt;
SELECT cuenta, agua, saneamto, tratamto, otros, multa, recargos
FROM dbo.FACTURA
WHERE cuenta > 0
-- Vertical
SELECT CUENTA, CONCEPTO, IMPORTE
FROM
(SELECT cuenta, agua, saneamto, tratamto, otros, multa, recargos
FROM dbo.FACTURA
WHERE cuenta > 0) p
UNPIVOT
(IMPORTE FOR CONCEPTO IN
(agua, saneamto, tratamto, otros, multa, recargos)
)AS unpvt;
Ejemplos de PIVOT
-- Agrupado por Meses
SELECT MONTH(fecha) AS MES
,SUM(f_total) AS TOTAL
FROM Facturacion.Opr_Facturas
WHERE YEAR(fecha) = 2013
GROUP BY MONTH(fecha)
-- Meses de Forma Horizontal
SELECT 'TOTALES' AS MES, [1] Ene, [2] Feb, [3] Mar, [4] Abr, [5] May, [6] Jun,
[7] Jul, [8] Ago, [9] Sep, [10] Oct, [11] Nov, [12] Dic
FROM (
SELECT MONTH(fecha) AS MES
,SUM(f_total) AS TOTAL
FROM Facturacion.Opr_Facturas
WHERE YEAR(fecha) = 2013
GROUP BY MONTH(fecha)
) V PIVOT ( SUM(TOTAL) FOR MES IN ([1], [2], [3], [4], [5],
[6], [7], [8], [9], [10], [11], [12]) ) as PT
-- Totales por Tarifa
SELECT id_tarifa AS TARIFA
,COUNT(id_tarifa) AS TOTAL
FROM Padron.Cat_Padron
WHERE id_cuenta > 0
AND id_estatus = 1
GROUP BY id_tarifa
-- Por tarifa Horizontal
SELECT 'TOTALES' AS TARIFA, [1] DOMESTICO, ISNULL([2],0) URBANO, ISNULL([3],0) RESIDENCIAL, [4] HOTELERA, [5] COMERCIAL, [6] INDUSTRIAL,
[7] SERVS
FROM (
SELECT id_tarifa AS TARIFA
,COUNT(id_tarifa) AS TOTAL
FROM Padron.Cat_Padron
WHERE id_cuenta > 0
AND id_estatus = 1
GROUP BY id_tarifa
) V PIVOT ( SUM(TOTAL) FOR TARIFA IN ([1], [2], [3], [4], [5], [6], [7]) ) as PT
SELECT 'TOTALES' AS TARIFA,
[1], [2], [3], [4], [5], [6], [7]
FROM
( SELECT id_tarifa AS TARIFA
,COUNT(id_tarifa) AS TOTAL
FROM Padron.Cat_Padron
WHERE id_cuenta > 0
AND id_estatus = 1
GROUP BY id_tarifa) AS SourceTable
PIVOT
(
SUM(TOTAL)
FOR TARIFA IN ([1], [2], [3], [4], [5], [6], [7])
) AS PivotTable;
SELECT 'TARIFAS' AS TARIFA,
[1], [2], [3], [4], [5], [6], [7]
FROM
( SELECT id_tipousuario AS TARIFA
,descripcion AS DESCRIPCION
FROM Padron.Cat_TiposUsuario
WHERE inactivo = 0) AS SourceTable
PIVOT
(MAX(DESCRIPCION)
FOR TARIFA IN ([1], [2], [3], [4], [5], [6], [7])
) AS PivotTable;
SELECT MONTH(fecha) AS MES
,SUM(f_total) AS TOTAL
FROM Facturacion.Opr_Facturas
WHERE YEAR(fecha) = 2013
GROUP BY MONTH(fecha)
-- Meses de Forma Horizontal
SELECT 'TOTALES' AS MES, [1] Ene, [2] Feb, [3] Mar, [4] Abr, [5] May, [6] Jun,
[7] Jul, [8] Ago, [9] Sep, [10] Oct, [11] Nov, [12] Dic
FROM (
SELECT MONTH(fecha) AS MES
,SUM(f_total) AS TOTAL
FROM Facturacion.Opr_Facturas
WHERE YEAR(fecha) = 2013
GROUP BY MONTH(fecha)
) V PIVOT ( SUM(TOTAL) FOR MES IN ([1], [2], [3], [4], [5],
[6], [7], [8], [9], [10], [11], [12]) ) as PT
-- Totales por Tarifa
SELECT id_tarifa AS TARIFA
,COUNT(id_tarifa) AS TOTAL
FROM Padron.Cat_Padron
WHERE id_cuenta > 0
AND id_estatus = 1
GROUP BY id_tarifa
-- Por tarifa Horizontal
SELECT 'TOTALES' AS TARIFA, [1] DOMESTICO, ISNULL([2],0) URBANO, ISNULL([3],0) RESIDENCIAL, [4] HOTELERA, [5] COMERCIAL, [6] INDUSTRIAL,
[7] SERVS
FROM (
SELECT id_tarifa AS TARIFA
,COUNT(id_tarifa) AS TOTAL
FROM Padron.Cat_Padron
WHERE id_cuenta > 0
AND id_estatus = 1
GROUP BY id_tarifa
) V PIVOT ( SUM(TOTAL) FOR TARIFA IN ([1], [2], [3], [4], [5], [6], [7]) ) as PT
SELECT 'TOTALES' AS TARIFA,
[1], [2], [3], [4], [5], [6], [7]
FROM
( SELECT id_tarifa AS TARIFA
,COUNT(id_tarifa) AS TOTAL
FROM Padron.Cat_Padron
WHERE id_cuenta > 0
AND id_estatus = 1
GROUP BY id_tarifa) AS SourceTable
PIVOT
(
SUM(TOTAL)
FOR TARIFA IN ([1], [2], [3], [4], [5], [6], [7])
) AS PivotTable;
SELECT 'TARIFAS' AS TARIFA,
[1], [2], [3], [4], [5], [6], [7]
FROM
( SELECT id_tipousuario AS TARIFA
,descripcion AS DESCRIPCION
FROM Padron.Cat_TiposUsuario
WHERE inactivo = 0) AS SourceTable
PIVOT
(MAX(DESCRIPCION)
FOR TARIFA IN ([1], [2], [3], [4], [5], [6], [7])
) AS PivotTable;
Suscribirse a:
Entradas (Atom)