Quiero exportar desde un procedimiento almacenado a Excel
-
Friday, February 18, 2011 8:43 PMPor 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....
All Replies
-
Friday, February 18, 2011 8:45 PMModerator
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/ -
Friday, February 18, 2011 10:01 PM
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
-
Friday, February 18, 2011 10:18 PMModerator
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/ -
Friday, February 18, 2011 10:28 PM
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
-
Friday, February 18, 2011 10:47 PMModerator
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:
Si no lo logras, nos dices.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'
Alberto López Grande
SQL Server MVP
Visita mi blog en http://qwalgrande.blogspot.es/- Proposed As Answer by qwalgrandeMVP, Moderator Friday, February 18, 2011 10:47 PM
- Marked As Answer by Eduardo PorteschellerMicrosoft Community Contributor, Moderator Wednesday, February 23, 2011 2:29 PM
-
Monday, February 21, 2011 2:17 PM
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 asctodo 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.
- No se puede obtener la información de columna del proveedor OLE DB "Microsoft.Jet.OLEDB.4.0" para el servidor vinculado "(null)".
-
Monday, February 21, 2011 9:43 PMModerator
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/ -
Tuesday, February 22, 2011 1:56 PM
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 --6Cuando 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
-
Tuesday, February 22, 2011 3:11 PMModerator
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/ -
Tuesday, February 22, 2011 3:38 PM
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.
-
Tuesday, February 22, 2011 10:25 PMModerator
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/- Marked As Answer by Eduardo PorteschellerMicrosoft Community Contributor, Moderator Wednesday, February 23, 2011 2:29 PM
-
Wednesday, February 23, 2011 2:39 PM
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.

