none
Quiero exportar desde un procedimiento almacenado a Excel

    Pregunta

  • Por favor necesito ayuda de que forma consigo que desde lo que arroje un procedimiento almacenado pueda exportar a excel la verdad no quiero hacerlo desde DTS ni de Otros solo desde SQL server por favor ayudadme....
    viernes, 18 de febrero de 2011 20:43

Respuestas

  • Hola.

    El paquete de Integration Services es el que debe ocuparse de todas esas cosas (dar con los parámetros, tomar la ruta, volcar a Excel). Es decir, no hay que "enviar datos al dtsx", es el proceso que configura el traspaso desde SQL Server, tomando los datos mediante un procedimiento almacenado, a Excel.

    Así que de ello deduzco que éste sería tu primer dtsx. Te recomiendo que hagas los tutoriales de los Books Online para adquirir soltura con la tecnología:

    http://msdn.microsoft.com/es-es/library/ms169917.aspx

    Pero te dejo también cómo podrías realizar el volcado por openrowset, por si prefieres usar este otro mecanismo por el momento:

    INSERT INTO OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
    'Excel 8.0;Database=C:\Temp\Libro1.xls;', 
    'SELECT Campo1, Campo2, Campo3 FROM [Hoja1$]') 
    exec MiProcedimiento @pFechaDesde = '20110101', @pFechaHasta = '20110201'
    
    Si no lo logras, nos dices.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    viernes, 18 de febrero de 2011 22:47
  • Hola.

    Te recomiendo que guardes los datos en una plantilla (ruta fija) y luego los muevas a su ubicación definitiva desde VB. No es que crea que sea el mejor método para realizarlo, pero llegados a este punto es una forma fácil y rápida de solventar el problema.

    Así, tendrías 3 pasos.

    1.- Copiar la plantilla desde donde esté a C:\Temp\Libro1.xls, sobreescribiendo el fichero que pueda existir en esa ruta de ejecuciones previas (desde VB).

    2.- Cargar el fichero (desde tu procedimiento almacenado).

    3.- Copiar el fichero a la ubicación definitiva.

    Espero te sirva, pero si no es así, nos dices.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    martes, 22 de febrero de 2011 22:25

Todas las respuestas

  • Hola.

    ¿Cómo ejecutarás el procedimiento? ¿Serás tú, de forma manual? ¿Una aplicación? ¿Un job?


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    viernes, 18 de febrero de 2011 20:45
  •  

    lo hago desde parametros con Vb 2005 ya que tengo que escoger los rangos de fechas y de hacerlo por el Dts la verdad no he encontrado con algun tutorial que lo muestre con procedimientos almacenados

    viernes, 18 de febrero de 2011 22:01
  • Hola.

    Si lo haces desde Vb, tendrías que preguntar en un foro de programación para que te orienten. Aquí podemos ayudarte con el procedimiento almacenado, pero no con lo demás.

    La opción de hacerlo con un dtsx es bastante simple, tanto como si volcaras desde una consulta (o incluso más, por lo del paso de parámetros). Si has hecho alguna vez un dtsx, te recomendaría que fueras por esta vía, en la que por otra parte puedo decirte cómo hacerlo.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    viernes, 18 de febrero de 2011 22:18
  • Lo de enviar los parametros ya lo hice igualmente la ruta, si puedes ayudarme con dtsx excelente pero porfa soy nuevo en esto en realidad soy aprendiz aun, pero me surge algunas inquietudes como enviar los datos al dtsx seria muy bueno que me espliques gracias

     

    viernes, 18 de febrero de 2011 22:28
  • Hola.

    El paquete de Integration Services es el que debe ocuparse de todas esas cosas (dar con los parámetros, tomar la ruta, volcar a Excel). Es decir, no hay que "enviar datos al dtsx", es el proceso que configura el traspaso desde SQL Server, tomando los datos mediante un procedimiento almacenado, a Excel.

    Así que de ello deduzco que éste sería tu primer dtsx. Te recomiendo que hagas los tutoriales de los Books Online para adquirir soltura con la tecnología:

    http://msdn.microsoft.com/es-es/library/ms169917.aspx

    Pero te dejo también cómo podrías realizar el volcado por openrowset, por si prefieres usar este otro mecanismo por el momento:

    INSERT INTO OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
    'Excel 8.0;Database=C:\Temp\Libro1.xls;', 
    'SELECT Campo1, Campo2, Campo3 FROM [Hoja1$]') 
    exec MiProcedimiento @pFechaDesde = '20110101', @pFechaHasta = '20110201'
    
    Si no lo logras, nos dices.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    viernes, 18 de febrero de 2011 22:47
  • Muy buenas y gracias por sus ayudas pero tengo una pregunta la consulta tiene inner joins tengo que utilizar los puntero en la consulta del openrowset ademas en el SP no esta dinamico interesa en algo y me muestra los siguientes errores.

    • No se puede obtener la información de columna del proveedor OLE DB "Microsoft.Jet.OLEDB.4.0" para el servidor vinculado "(null)".
    • El proveedor OLE DB "Microsoft.Jet.OLEDB.4.0" para el servidor vinculado "(null)" devolvió el mensaje "El motor de base de datos Microsoft Jet no pudo encontrar el objeto 'Hoja1$'. Asegúrese de que el objeto existe, y que ha escrito el nombre y la ruta de acceso al objeto correctamente.".

     

    y ya hice esto otro

    exec
     sp_configure 'Show Advanced Options'
    , 1
    GO

    reconfigure
    Go

    exec sp_configure 'Ad Hoc Distributed Queries' , 1
    GO

    reconfigure
    Go

    y para mejor comprension aqui les dejo la estructura del SP para mejor comprension

    ALTER PROCEDURE [dbo].[sp_***********]
    @vReportFechaInicio as varchar(15),
    @vReportFechaFinal as varchar(15),
    @vRuta

    AS
    declare @TempInicio as datetime
    declare @Tempfinal as datetime

            SELECT @TempInicio = CAST(@vReportFechaInicio AS datetime)
            SELECT @Tempfinal = CAST(@vReportFechaFinal AS datetime)

    INSERT INTO OPENROWSET('Microsoft.Jet.OLEDB.4.0',
    'Excel 8.0;Database=C:\Temp\Libro1.xls;',
    'SELECT tp1, tp2, lp3,tp4,tp5,fp6,tp7 FROM [Hoja1$]')

    Select    e.tp1,--0
                left (e.Fecha ,12) as Fecha,--1
                q.lp3as ciudad,--2
                e.tp4,--3
                e.tp5,--4
                j.fp6,--5
                e.tp7
        From ***** e inner join xxxxx j
            on e.xxx= j.xxx
                inner join ººººº q
            on e.ccccc = q.ccccc
                inner join ##### o
            on j.$$$$$ = o.$$$$$
            Where and (e.fecha >=@TempInicio)
                and (e.Fecha <= dateadd(dd,1,@Tempfinal))
                order by Fecha asc

    todo esto lo hice con el fin de que me hagan recomendaciones no es que crean que quiero que me solucionen el problema pero es que no se como lidiar con este error.

     

     

    lunes, 21 de febrero de 2011 14:17
  • Hola.

    Asegúrate de que el fichero Excel existe y está en C:\Temp\Libro1.xls, y que tiene una hoja que se llame "Hoja1". Hice esa suposición. Si el fichero es otro y el nombre de la hoja es otro, adecua lo que te sugerí para tus condiciones.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    lunes, 21 de febrero de 2011 21:43
  • qwalgrande <abbr class="affil"> Olle gracias me fue muy util tu alluda por que realmente lo hice pero en un qwery pero desde el SP no me funciona tengo el siguiente codigo ya que le tengo que dar la ruta se me ha complicado.
    </abbr>

    SET @vTemp ='INSERT INTO OPENROWSET('+ '''Microsoft.ACE.OLEDB.12.0'''+','+ '''Excel 12.0;Database=' + @vRuta + ';HDR=YES'''+ ','+'''SELECT * FROM [Hoja1$]'''+')'

    EXEC (@vTemp )    Select    e.CodigoReporte,--0
                left (e.FechaReporte,12) as Fecha,--1
                e.NitIdentificacion,--3
                e.NamePersona ,--4
                j.NameFuncionario,--5
                e.AsuntoEmail --6

    Cuando ejecuto me sale el siguiente error que  es

    Mens. 102, Nivel 15, Estado 1, Línea 1
    Sintaxis incorrecta cerca de ')'.

    creo que la concatenacion cua le doy ejecutar pero no se como hacerle

    martes, 22 de febrero de 2011 13:56
  • Hola.

    Es posible que falte o sobre algún paréntesis, resultado de la construcción de la cadena. ¿Qué cadena resultante obtienes?

    Sería deseable que no lo ejecutaras de forma dinámica. 


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    martes, 22 de febrero de 2011 15:11
  • De no ser asi como le asigno la ruta que es enviada desde Vb 2005, ademas la cadena esta bien ya que le hago un print, la copio y la ejecuto en una consulta con el select y resulta. creeria que esta bien nose

    la verdad no se como solucionar esto te agrdeceria mucho si me puedes dar pautas o alguna estructura de como hacerlo.

     

    martes, 22 de febrero de 2011 15:38
  • Hola.

    Te recomiendo que guardes los datos en una plantilla (ruta fija) y luego los muevas a su ubicación definitiva desde VB. No es que crea que sea el mejor método para realizarlo, pero llegados a este punto es una forma fácil y rápida de solventar el problema.

    Así, tendrías 3 pasos.

    1.- Copiar la plantilla desde donde esté a C:\Temp\Libro1.xls, sobreescribiendo el fichero que pueda existir en esa ruta de ejecuciones previas (desde VB).

    2.- Cargar el fichero (desde tu procedimiento almacenado).

    3.- Copiar el fichero a la ubicación definitiva.

    Espero te sirva, pero si no es así, nos dices.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    martes, 22 de febrero de 2011 22:25
  • En lo que tu me ayudaste estuvo muy bien pero decidi hacerlo de esta forma ademas yo se que a muchos les ira a servir asi que lo publicare ¡A TODOS REALMENTE GRACIAS!

     

    'INSERT INTO OPENROWSET(''Microsoft.ACE.OLEDB.12.0'',
        ''Excel 12.0;Database=' + @vRuta + ';HDR=YES'',
        ''SELECT * FROM [Hoja1$]'')'+ 'Select    e.XXXXXXXX,--0
                left (e.XXXXXXXXXX,12) as Fecha,--1
                e.XXXXXXXXXX,--3
                e.XXXXXXXXXX ,--4
                j.XXXXXXXXXX,--5
                e.XXXXXXXXX --6
        From XXXXXXXXX e inner join XXXXXXXXX j
            on e.XXXXXXXXX= j.XXXXXXXXXX
                inner join XXXXXXX q
            on e.XXXXXXXX = q.XXXXXXXXX
                inner join XXXXXXXXXXX o
            on j.XXXXXXXXXX = o.XXXXXXXXXXXXXX
            Where e.XXXXXXXXXXXXXX = 10
                and CONVERT(Varchar(8),e.XXXXXXXXXX,112) >=' + @vReportFechaInicio + '
                and CONVERT(Varchar(8),e.XXXXXXXXXX,112) <= ' + @vReportFechaFinal +
                'order by XXXXXXXXXXX asc'

     

    Como es de suponer esto es SQL dinamico.

    miércoles, 23 de febrero de 2011 14:39