lunes, 4 de diciembre de 2017

GUARDAR UN ARCHIVO [PDF|XML|TXT] EN BINARIO EN UNA TABLA DE SQL


--╔═════════════════════════════════════════════════════════════════════════════╗
--║ GUARDAR UN ARCHIVO [PDF|XML|TXT] EN BINARIO EN UNA TABLA DE SQL                          --║
--╚═════════════════════════════════════════════════════════════════════════════╝


DECLARE  @TxtFile          VARBINARY (MAX)
DECLARE  @PdfFile          VARBINARY (MAX)
DECLARE  @XmlFile          VARBINARY (MAX)

SELECT @PdfFile = CAST(bulkcolumn AS VARBINARY(MAX)) FROM OPENROWSET(BULK'C:\Basura\NombreArchivo.pdf', SINGLE_BLOB ) AS x
SELECT @TxtFile = CAST(bulkcolumn AS VARBINARY(MAX)) FROM OPENROWSET(BULK'C:\Basura\NombreArchivo.txt', SINGLE_BLOB ) AS x
SELECT @XmlFile = CAST(bulkcolumn AS VARBINARY(MAX)) FROM OPENROWSET(BULK'C:\Basura\NombreArchivo.xml', SINGLE_BLOB ) AS x


INSERT INTO Billing.TableName (IdInvoice, IdBrokerdesk, IdCompany_Biller, IdCompany_Receiver
                                          ,InvoiceDate, TxtFile, PdfFile, XmlFile, IdentifierFile, NameFile)

SELECT 44,1,181,205,'2017-09-14',@TxtFile, @PdfFile, @XmlFile, NEWID(), 'una descripcion';
go

SELECT * FROM Billing.Files

visualiza todos los archivos contenidos en una carpeta de Windows desde SQL-T


visualiza todos los archivos contenidos en una carpeta de Windows
desde SQL-T



-- ==============================================
-- Autor:                  MANUEL OMAR OLGUÍN HERNÁNDEZ
-- Fecha:                  2017 OCTUBRE 27
-- Versión:                1.0
-- Descripcion:            VISUALIZA EN UNA TABLA LOS ARCHIVOS CONTENIDOS EN UNA CARPETA DE WINDOWS   ;)
--
--                  EXEC Generic.up_GetFileNames @Path = 'C:\Trace\';
-- =================================================

ALTER PROCEDURE [Dictionary].[up_GetFileNames]
@Path        NVARCHAR (300)
AS

       DECLARE @strSQL            NVARCHAR (500)
                                               -- no acepta espacios en los nombres de las carpetas
       SET @strSQL = 'dir ' + @Path;
                                                 


-- se realizan varios filtros tanto en columnas como ya en el texto de cada fila para obtener el nombre del pdf correcto
declare @temptable table ([FileName] nvarchar(2000))
Insert into @temptable
EXEC xp_cmdshell @strSQL;

DECLARE @Prefijo INT



-- prefijo es el número de caracteres a eliminar iniciando desde la izquierda
-- es para quitar fechas, espacios , horas, número de bytes
SET @Prefijo = 41


                            SELECT
                            
                            NombreArchivo = ltrim(rtrim(SUBSTRING([FileName], @Prefijo, LEN(FILENAME)-@Prefijo+1)))
                           into #temp
                           from @temptable
                           where [FileName] not like '%volume%'
                           and [FileName] is not null
                           and [FileName] not like '%bytes%'
                           AND [FileName] NOT LIKE '%Directorio de%'
                           AND [FileName] NOT LIKE '%<DIR>%'
                   


select 
       --Orden = ROW_NUMBER() OVER (ORDER BY NOMBREARCHIVO)
        [FileName]  = NombreArchivo
       ,[Type] = SUBSTRING (NombreArchivo, CHARINDEX('.',NombreArchivo,LEN(NombreArchivo)-5)+1,4)
      
        from #temp order by NombreArchivo

drop table #temp





BUSCAR UN ARCHIVO EN WINDOWS DESDE SQL-T


LOS PARÁMETROS DE ENTRADA SON LA RUTA
Y LUEGO UN NOMBRE A BUSCAR COMO ARCHIVO

-- =========================================================
-- Autor:                  -----------------------------
-- Fecha:                  --------------
-- Versión:                1.0
-- Requerimiento:          ------------
-- Descripcion:            CREA PROCEDIMIENTO PARA BUSCAR EN UN DIRECTORIO DE WINDOWS UN ARCHIVO BUSCADO POR UN "LIKE '%%'"
-- =================================================
ALTER PROCEDURE     [Billing].[up_GetFileName]
@PathFile    NVARCHAR (300),
@FileName    VARCHAR      (300) OUTPUT
AS

       DECLARE @strSQL            NVARCHAR (500)
       SET @strSQL = 'dir ' + @PathFile;

-- se realizan varios filtros tanto en columnas como ya en el texto de cada fila para obtener el nombre del pdf correcto
declare @temptable table ([FileName] nvarchar(200))
Insert into @temptable
EXEC xp_cmdshell @strSQL;

SET @FileName = (
                           select NombreArchivo = ltrim(rtrim(SUBSTRING ([FileName], CHARINDEX ('T033',[FileName]), LEN ([FileName]) - CHARINDEX ('T033',[FileName]) +1)))
                           from @temptable where [FileName] not like '%volume%' and [FileName] is not null and [FileName] not like '%bytes%' AND [FileName] NOT LIKE '%Directorio de%'
                           )

GO








Saber si existe un archivo en el directorio de Windows




--╔════════════════════════════════════════╗
--║ SABER SI EXISTE UN ARCHIVO EN WINDOWS DESDE SQL    ║
--╚═════════════════════════════════════════╝

DECLARE @Archivo nvarchar(255)
DECLARE @Existe int
SELECT @Archivo='c:\Facturacion\store\pdf\RLI9910139T4\sent\33\2016\08\01\pdfg\RLI9910139T4_A15420_20160801_21099.PDF'
PRINT @Archivo
EXEC Master.dbo.xp_fileexist @Archivo , @Existe OUT
IF @Existe = 1
PRINT 'Existe el archivo'
ELSE PRINT 'No existe el archivo';
GO



GUARDAR UN BINARIO (PDF) EN UN DIRECTORIO DE WINDOWS


 El siguiente código lee un archivo en binario desde una base de datos
y lo guarda en un directorio en windows,
también se puede hacer una consulta sipmle y guardarla en un txt 

--╔═════════════════════════════════════════════╗
--║ GENERA UN TIPO BINARIO O EN SQL (VARBINARY) ║
--║ Y GUARDARLO EN UN DIRECTORIO EN WINDOWS     ║
--╚═════════════════════════════════════════════╝

sp_configure 'show advanced options', 1; 
GO 
RECONFIGURE; 
GO
EXEC sp_configure 'Ole Automation Procedures',1; 
GO
RECONFIGURE; 
GO


DECLARE @outPutPath VARCHAR(50) = 'C:\BASURA\test.txt'
DECLARE @data       VARBINARY(MAX)
DECLARE @Init       INT
DECLARE @fPath      VARCHAR(MAX)
DECLARE @folderPath VARCHAR(MAX)

SELECT       @Data = convert(varbinary,'hola, este query baja a un txt ésta cadena');


/* GUARDA UN ARCHIVO PDF QUE ESTÁ EN BINARIO EN BASE DE DATOS A UNA RUTA DE WINDOWS


SELECT       @Data = PdfFile
FROM         Billing.Files
WHERE        IdTaxDocument= 68453

*/


EXEC sp_OACreate 'ADODB.Stream', @init OUTPUT;                     -- An instace created
EXEC sp_OASetProperty @init, 'Type', 1;
EXEC sp_OAMethod @init, 'Open';                                                  -- Calling a method
EXEC sp_OAMethod @init, 'Write', NULL, @data;                      -- Calling a method
EXEC sp_OAMethod @init, 'SaveToFile', NULL, @outPutPath, 2; -- Calling a method
EXEC sp_OAMethod @init, 'Close';                                          -- Calling a method
EXEC sp_OADestroy @init;                                                         -- Closed the resources
GO--------------------------------------------------------------