Variable en cursor o Use en Procedure

04/03/2004 - 19:23 por Juan José Pinero | Informe spam
Hola Grupo,

Estoy haciendo un procedure y necesito abrir un cursor (perdonad los
detractores de los cursores, pero el fín justifica los medios) que apunte a
una de las 5 Bases de datos de que dispongo(BD1, BD2, BD3, BD4 y BD5). Al
procedure le paso la variable @BBDD sobre la que quiero realizar la
consulta.

Opción 1:
Use BD3

El problema es que se produce un error que informa que no se puede
utilizar Use en procedure

Opción 2:
Declare @MiTabla nvarchar(100)
Set @MiTabla = '[' + @BBDD + '].[dbo].[MiTablaComun]'
Declare MiCursor CURSOR FOR

SELECT *FROM @MiTabla
OPEN MiCursor

En este caso me dice que debo declarar la variable @MiTabla


No entiendo qué pasa. ¿Qué estoy haciendo mal?

Gracias de antemano.

Preguntas similare

Leer las respuestas

#6 Maximiliano D. A.
04/03/2004 - 20:30 | Informe spam
Esta bien y cual es el problema!! no te entiendo realmente!!


Salu2
Maxi
Buenos Aires Argentina
Desarrollador Microsoft 3 Estrellas .NET
[Maxi_accotto[arroba]speedy[punto]com[punto]ar
MSN:


"Juan José Pinero" escribió en el mensaje
news:c2805b$3qj$
Lo haría, pero la línea de cabera sólo puede tener campos de la consulta


de
cabecera y en las líneas de detalle sólo puede haber campos de la consulta
de detalle.

¿Me puedes confirma la imposibilidad de declarar un cursor con Sql


dinámico?

Gracias de todas formas.



Un saludo.



"Maximiliano D. A." <maxi_accotto[arroba]speedy[.]com[.]ar> escribió en el
mensaje news:
> Bueno ahora has sido muy claro y eso me gusta!! como cosa linda es que
> podemos sacar el cursor!!!
>
> Porque no intentas hacer algo asi como:
>
> Select tabla1.campos,tabla1..campos,tabla2.campos from tabla1 left join
> (select campos from tabla2) tabla2 on
> tabla1.campo_id = tabla2.campoid
>
>
> esta es una forma que te puede servir, adaptalo a tus tablas.
>
> Cuando yo te hablo de sp_executesql es porque vi que querias hacer un
select
> tipo asi:
>
> declare @mibase varchar(255)
>
> set @mibase ='maxi'
>
> Select * from @MIBASE.TABLA
>
> esto si no usas SqlDinamico no te funcionara :(
>
> Bye
>
> Salu2
> Maxi
> Buenos Aires Argentina
> Desarrollador Microsoft 3 Estrellas .NET
> [Maxi_accotto[arroba]speedy[punto]com[punto]ar
> MSN:
>
>
> "Juan José Pinero" escribió en el mensaje
> news:c27ue1$l3o$
> > Gracias por tu respuesta,
> >
> > No te he entendido bien, ¿te refieres a que abra el cursor utilizando
> > sp_executesql?
> > En cuanto a abrir el cursor con sp_executesql ya lo he intentado,


pero
me
> > dice que hay error de sintaxis cerca de sp_executesql.
> >
> > Esta es la cuestión por la que creo que no tengo más remedio que
utilizar
> > cursor en el procedure:
> >
> > Necesito ejecutar 2 consultas, las 2 devuelven varios registros. Estas
> > consultas deberé poder realizarlas en cualquiera de las 5 bases de


datos
> de
> > producción.
> >
> >
> > Consulta1 (Cabecera)
> > NºPedido, Proveedor, TotalUds, TotalImporte
> >
> > Consulta2 (Detalle)
> > Articulo, Uds, ImporteLinea
> >
> > Por cada registro de la Consulta1 obtendré varios registros de la
> Consulta2.
> >
> > El problema es que tengo que generar un fichero con el siguiente
formato:
> >
> > Consulta1.Registro1.NºPedido Consulta1.Registro1.Proveedor
> > Consulta1.Registro1.TotalUds Consulta1.Registro1.TotalImporte
> > Consulta2.Registro1.Articulo Consulta2.Registro1.Uds
> > Consulta2.Registro1.ImporteLinea
> > Consulta2.Registro2.Articulo Consulta2.Registro2.Uds
> > Consulta2.Registro2.ImporteLinea
> > Consulta2.Registro3.Articulo Consulta2.Registro3.Uds
> > Consulta2.Registro3.ImporteLinea
> > ..
> > ..
> > Consulta2.RegistroN.Articulo Consulta2.RegistroN.Uds
> > Consulta2.RegistroN.ImporteLinea
> >
> > Consulta1.Registro2.NºPedido Consulta1.Registro1.Proveedor
> > Consulta1.Registro1.TotalUds Consulta1.Registro1.TotalImporte
> > Consulta2.Registro1.Articulo Consulta2.Registro1.Uds
> > Consulta2.Registro1.ImporteLinea
> > Consulta2.Registro2.Articulo Consulta2.Registro2.Uds
> > Consulta2.Registro2.ImporteLinea
> > Consulta2.Registro3.Articulo Consulta2.Registro3.Uds
> > Consulta2.Registro3.ImporteLinea
> > .
> > .
> > Consulta2.RegistroN.Articulo Consulta2.RegistroN.Uds
> > Consulta2.RegistroN.ImporteLinea
> >
> >
> > Pues bien, con el cursor abro la Consulta1 y en una tabla temporal voy
> > generando las líneas que necesito escribir al fichero en orden. No


abro
> > cursor para la Consulta2, si no que hago un INSERT directamente en la
> tabla
> > temporal filtrando con las claves que me devuelve el cursor de la
> > Consulta1.
> >
> > No conozco ninguna otra forma de resolver este problema sin utilizar


el
> > cursor.
> >
> >
> >
> > Saludos y Gracias,
> >
> >
> >
> >
> > "Maximiliano D. A." <maxi_accotto[arroba]speedy[.]com[.]ar> escribió


en
el
> > mensaje news:#qj$
> > > Deberias usar SqlDinamico si queres por variable pasar la BASE o sea
> > > revisate en tus manuales el
> > >
> > > sp_executesql, esto podria serte util!!
> > >
> > > Ahora porque pensas usar un cursor? que necesitas hacer que no
> encontraste
> > > otra qie un cursor?
> > >
> > > Bye
> > >
> > >
> > > Salu2
> > > Maxi
> > > Buenos Aires Argentina
> > > Desarrollador Microsoft 3 Estrellas .NET
> > > [Maxi_accotto[arroba]speedy[punto]com[punto]ar
> > > MSN:
> > >
> > >
> > > "Juan José Pinero" escribió en el mensaje
> > > news:c27s7q$4o3$
> > > > Hola Grupo,
> > > >
> > > > Estoy haciendo un procedure y necesito abrir un cursor (perdonad


los
> > > > detractores de los cursores, pero el fín justifica los medios) que
> > apunte
> > > a
> > > > una de las 5 Bases de datos de que dispongo(BD1, BD2, BD3, BD4 y
BD5).
> > Al
> > > > procedure le paso la variable @BBDD sobre la que quiero realizar


la
> > > > consulta.
> > > >
> > > > Opción 1:
> > > > Use BD3
> > > >
> > > > El problema es que se produce un error que informa que no se
puede
> > > > utilizar Use en procedure
> > > >
> > > > Opción 2:
> > > > Declare @MiTabla nvarchar(100)
> > > > Set @MiTabla = '[' + @BBDD + '].[dbo].[MiTablaComun]'
> > > > Declare MiCursor CURSOR FOR
> > > >
> > > > SELECT *FROM @MiTabla
> > > > OPEN MiCursor
> > > >
> > > > En este caso me dice que debo declarar la variable @MiTabla
> > > >
> > > >
> > > > No entiendo qué pasa. ¿Qué estoy haciendo mal?
> > > >
> > > > Gracias de antemano.
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > >
> > >
> > >
> > > Outgoing mail is certified Virus Free.
> > > Checked by AVG anti-virus system (http://www.grisoft.com).
> > > Version: 6.0.593 / Virus Database: 376 - Release Date: 20/02/2004
> > >
> > >
> >
> >
> >
> >
>
>
>
> Outgoing mail is certified Virus Free.
> Checked by AVG anti-virus system (http://www.grisoft.com).
> Version: 6.0.593 / Virus Database: 376 - Release Date: 20/02/2004
>
>







Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.593 / Virus Database: 376 - Release Date: 20/02/2004
Respuesta Responder a este mensaje
#7 Juan José Pinero
04/03/2004 - 21:05 | Informe spam
Disculpa las molestias Maximiliano.

El problema es el siguiente:

Tengo 5 bases de datos de producción. Cada una se ocupa de una parte del
negocio, aunque la estructura de las BBDD es idéntica.

Me solicitan que genere de forma automática y diariamente un fichero de
texto sobre los pedidos de compras con el formato siguiente:


Pedido1.NºPedido Pedido1.Proveedor Pedido1.TotalUds Pedido1.TotalImpore
Pedido1.Articulo1 Pedido1.UnidadesArticulo Pedido1.ImporteArticulo
Pedido1.Articulo2 Pedido1.UnidadesArticulo Pedido1.ImporteArticulo
Pedido1.Articulo3 Pedido1.UnidadesArticulo Pedido1.ImporteArticulo
.
.
Pedido1.ArticuloN Pedido1.UnidadesArticulo Pedido1.ImporteArticulo
Pedido2.NºPedido Pedido2.Proveedor Pedido2.TotalUds Pedido2.TotalImpore
Pedido2.Articulo1 Pedido2.UnidadesArticulo Pedido2.ImporteArticulo
Pedido2.Articulo2 Pedido2.UnidadesArticulo Pedido2.ImporteArticulo
Pedido2.Articulo3 Pedido2.UnidadesArticulo Pedido2.ImporteArticulo
.
.
Pedido2.ArticuloN Pedido2.UnidadesArticulo Pedido2.ImporteArticulo
.

.
PedidoN.NºPedido Pedido2.Proveedor PedidoN.TotalUds PedidoN.TotalImpore
PedidoN.Articulo1 PedidoN.UnidadesArticulo PedidoN.ImporteArticulo
PedidoN.Articulo2 PedidoN.UnidadesArticulo PedidoN.ImporteArticulo
PedidoN.Articulo3 PedidoN.UnidadesArticulo PedidoN.ImporteArticulo
.
.
PedidoN.ArticuloN PedidoN.UnidadesArticulo PedidoN.ImporteArticulo


Como ves es la típica estructura de cabecera detalle (una linea para la
cabecera y n lineas para el detalle)

Las líneas de cabecera son generadas por la Tabla1.
Las líneas de detalle son generadas por la Tabla2.

Pues bien, para resolver el problema he creado un procedure que crea una
tabla temporal:

CREATE PROCEDURE [MiProcedure] @BBDD as nvarchar(50)


CREATE TABLE #TablaTemp
(
Id int identity (1, 1) PRIMARY KEY
LineaFichero nvarchar(100)
)

Declaro un cursor

DECLARE MiCursor FOR

SELECT NPedido , Proveedor, TotalUds, TotalImporte, ClaveTabla2 FROM
[BD1].[dbo].Tabla1

OPEN MiCursor

FETCH NEXT FROM MiCursor into @a1, @a2, @a3, @a4, @a5

WHILE @@FETCH_STATUS=0
BEGIN
INSERT INTO #TablaTemp (LineaFichero) VALUES (@a1 + @a2 + @a3 + @a4)
INSERT INTO #TablaTemp (LineaFichero)
SELECT Articulo + UnidadesArticulo + ImporteArticulo FROM
[BD1].[dbo].Tabla2 WHERE ClaveTabla2=@a5

FETCH NEXT FROM MiCursor into @a1, @a2, @a3, @a4, @a5
END



De esta forma en la tabla #TablaTemp tengo las líneas ordenadas (por el
campo Id) como deben ser escritas en el fichero a generar.

La cuestión es que [BD1] debe ser variable , ya que la consulta la tengo que
generar en las 5 bases de datos de producción, pasándole al procedure una
variable @BBDD, pero no veo la forma de hacerlo, ya que no puedo abrir el
Cursos con sp_executesql ni con execute, únicamente me lo permite con
SELECT.

Por otro lado intenté hacer un Use @BBDD, pero tampoco puedo, ya que parece
que el uso de Use dentro de un procedure no está permitido.

En fin, que no sé como salir de aquí.

Saludos.









"Maximiliano D. A." <maxi_accotto[arroba]speedy[.]com[.]ar> escribió en el
mensaje news:Ofz1y#
Esta bien y cual es el problema!! no te entiendo realmente!!


Salu2
Maxi
Buenos Aires Argentina
Desarrollador Microsoft 3 Estrellas .NET
[Maxi_accotto[arroba]speedy[punto]com[punto]ar
MSN:


"Juan José Pinero" escribió en el mensaje
news:c2805b$3qj$
> Lo haría, pero la línea de cabera sólo puede tener campos de la consulta
de
> cabecera y en las líneas de detalle sólo puede haber campos de la


consulta
> de detalle.
>
> ¿Me puedes confirma la imposibilidad de declarar un cursor con Sql
dinámico?
>
> Gracias de todas formas.
>
>
>
> Un saludo.
>
>
>
> "Maximiliano D. A." <maxi_accotto[arroba]speedy[.]com[.]ar> escribió en


el
> mensaje news:
> > Bueno ahora has sido muy claro y eso me gusta!! como cosa linda es que
> > podemos sacar el cursor!!!
> >
> > Porque no intentas hacer algo asi como:
> >
> > Select tabla1.campos,tabla1..campos,tabla2.campos from tabla1 left


join
> > (select campos from tabla2) tabla2 on
> > tabla1.campo_id = tabla2.campoid
> >
> >
> > esta es una forma que te puede servir, adaptalo a tus tablas.
> >
> > Cuando yo te hablo de sp_executesql es porque vi que querias hacer un
> select
> > tipo asi:
> >
> > declare @mibase varchar(255)
> >
> > set @mibase ='maxi'
> >
> > Select * from @MIBASE.TABLA
> >
> > esto si no usas SqlDinamico no te funcionara :(
> >
> > Bye
> >
> > Salu2
> > Maxi
> > Buenos Aires Argentina
> > Desarrollador Microsoft 3 Estrellas .NET
> > [Maxi_accotto[arroba]speedy[punto]com[punto]ar
> > MSN:
> >
> >
> > "Juan José Pinero" escribió en el mensaje
> > news:c27ue1$l3o$
> > > Gracias por tu respuesta,
> > >
> > > No te he entendido bien, ¿te refieres a que abra el cursor


utilizando
> > > sp_executesql?
> > > En cuanto a abrir el cursor con sp_executesql ya lo he intentado,
pero
> me
> > > dice que hay error de sintaxis cerca de sp_executesql.
> > >
> > > Esta es la cuestión por la que creo que no tengo más remedio que
> utilizar
> > > cursor en el procedure:
> > >
> > > Necesito ejecutar 2 consultas, las 2 devuelven varios registros.


Estas
> > > consultas deberé poder realizarlas en cualquiera de las 5 bases de
datos
> > de
> > > producción.
> > >
> > >
> > > Consulta1 (Cabecera)
> > > NºPedido, Proveedor, TotalUds, TotalImporte
> > >
> > > Consulta2 (Detalle)
> > > Articulo, Uds, ImporteLinea
> > >
> > > Por cada registro de la Consulta1 obtendré varios registros de la
> > Consulta2.
> > >
> > > El problema es que tengo que generar un fichero con el siguiente
> formato:
> > >
> > > Consulta1.Registro1.NºPedido Consulta1.Registro1.Proveedor
> > > Consulta1.Registro1.TotalUds Consulta1.Registro1.TotalImporte
> > > Consulta2.Registro1.Articulo Consulta2.Registro1.Uds
> > > Consulta2.Registro1.ImporteLinea
> > > Consulta2.Registro2.Articulo Consulta2.Registro2.Uds
> > > Consulta2.Registro2.ImporteLinea
> > > Consulta2.Registro3.Articulo Consulta2.Registro3.Uds
> > > Consulta2.Registro3.ImporteLinea
> > > ..
> > > ..
> > > Consulta2.RegistroN.Articulo Consulta2.RegistroN.Uds
> > > Consulta2.RegistroN.ImporteLinea
> > >
> > > Consulta1.Registro2.NºPedido Consulta1.Registro1.Proveedor
> > > Consulta1.Registro1.TotalUds Consulta1.Registro1.TotalImporte
> > > Consulta2.Registro1.Articulo Consulta2.Registro1.Uds
> > > Consulta2.Registro1.ImporteLinea
> > > Consulta2.Registro2.Articulo Consulta2.Registro2.Uds
> > > Consulta2.Registro2.ImporteLinea
> > > Consulta2.Registro3.Articulo Consulta2.Registro3.Uds
> > > Consulta2.Registro3.ImporteLinea
> > > .
> > > .
> > > Consulta2.RegistroN.Articulo Consulta2.RegistroN.Uds
> > > Consulta2.RegistroN.ImporteLinea
> > >
> > >
> > > Pues bien, con el cursor abro la Consulta1 y en una tabla temporal


voy
> > > generando las líneas que necesito escribir al fichero en orden. No
abro
> > > cursor para la Consulta2, si no que hago un INSERT directamente en


la
> > tabla
> > > temporal filtrando con las claves que me devuelve el cursor de la
> > > Consulta1.
> > >
> > > No conozco ninguna otra forma de resolver este problema sin utilizar
el
> > > cursor.
> > >
> > >
> > >
> > > Saludos y Gracias,
> > >
> > >
> > >
> > >
> > > "Maximiliano D. A." <maxi_accotto[arroba]speedy[.]com[.]ar> escribió
en
> el
> > > mensaje news:#qj$
> > > > Deberias usar SqlDinamico si queres por variable pasar la BASE o


sea
> > > > revisate en tus manuales el
> > > >
> > > > sp_executesql, esto podria serte util!!
> > > >
> > > > Ahora porque pensas usar un cursor? que necesitas hacer que no
> > encontraste
> > > > otra qie un cursor?
> > > >
> > > > Bye
> > > >
> > > >
> > > > Salu2
> > > > Maxi
> > > > Buenos Aires Argentina
> > > > Desarrollador Microsoft 3 Estrellas .NET
> > > > [Maxi_accotto[arroba]speedy[punto]com[punto]ar
> > > > MSN:
> > > >
> > > >
> > > > "Juan José Pinero" escribió en el mensaje
> > > > news:c27s7q$4o3$
> > > > > Hola Grupo,
> > > > >
> > > > > Estoy haciendo un procedure y necesito abrir un cursor (perdonad
los
> > > > > detractores de los cursores, pero el fín justifica los medios)


que
> > > apunte
> > > > a
> > > > > una de las 5 Bases de datos de que dispongo(BD1, BD2, BD3, BD4 y
> BD5).
> > > Al
> > > > > procedure le paso la variable @BBDD sobre la que quiero realizar
la
> > > > > consulta.
> > > > >
> > > > > Opción 1:
> > > > > Use BD3
> > > > >
> > > > > El problema es que se produce un error que informa que no se
> puede
> > > > > utilizar Use en procedure
> > > > >
> > > > > Opción 2:
> > > > > Declare @MiTabla nvarchar(100)
> > > > > Set @MiTabla = '[' + @BBDD + '].[dbo].[MiTablaComun]'
> > > > > Declare MiCursor CURSOR FOR
> > > > >
> > > > > SELECT *FROM @MiTabla
> > > > > OPEN MiCursor
> > > > >
> > > > > En este caso me dice que debo declarar la variable @MiTabla
> > > > >
> > > > >
> > > > > No entiendo qué pasa. ¿Qué estoy haciendo mal?
> > > > >
> > > > > Gracias de antemano.
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > >
> > > >
> > > >
> > > > Outgoing mail is certified Virus Free.
> > > > Checked by AVG anti-virus system (http://www.grisoft.com).
> > > > Version: 6.0.593 / Virus Database: 376 - Release Date: 20/02/2004
> > > >
> > > >
> > >
> > >
> > >
> > >
> >
> >
> >
> > Outgoing mail is certified Virus Free.
> > Checked by AVG anti-virus system (http://www.grisoft.com).
> > Version: 6.0.593 / Virus Database: 376 - Release Date: 20/02/2004
> >
> >
>
>



Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.593 / Virus Database: 376 - Release Date: 20/02/2004


Respuesta Responder a este mensaje
#8 Maximiliano D. A.
04/03/2004 - 21:26 | Informe spam
Hola!! no te la compliques tanto!! porque no usas consultas distribuidas

o sea:

Select tabla1.campos,tabla2.campos FROM basededatos.tabla1 left join
basededatos.tabla2 on
basededatos.tabla1.campollave = basededatos.tabla2.campollave UNIION ALL
select basededatos2.tabla1.campos,basededatos2.tabla2.campos FROM
basededatos2.tabla1 left join basededatos2.tabla2 on
basededatos2.tabla1.campollave = basededatos2.tabla2.campollave!!!

y asi!! entonces tendras todo en una sola consulta :-D

Adaptalo a tus Bases!!

Revisa en los BOL la sintaxis union all para que la entiendas mejor!! pero
yo tambien tengo por base un negocio y lo armo de esta forma por ej, luego
con ese select podes meterlo donde quieras:

Informe Excel, exportar,etc.

Espero haberte ayudado!!

Salu2



Salu2
Maxi
Buenos Aires Argentina
Desarrollador Microsoft 3 Estrellas .NET
[Maxi_accotto[arroba]speedy[punto]com[punto]ar
MSN:


"Juan José Pinero" escribió en el mensaje
news:c28268$f71$
Disculpa las molestias Maximiliano.

El problema es el siguiente:

Tengo 5 bases de datos de producción. Cada una se ocupa de una parte del
negocio, aunque la estructura de las BBDD es idéntica.

Me solicitan que genere de forma automática y diariamente un fichero de
texto sobre los pedidos de compras con el formato siguiente:


Pedido1.NºPedido Pedido1.Proveedor Pedido1.TotalUds Pedido1.TotalImpore
Pedido1.Articulo1 Pedido1.UnidadesArticulo Pedido1.ImporteArticulo
Pedido1.Articulo2 Pedido1.UnidadesArticulo Pedido1.ImporteArticulo
Pedido1.Articulo3 Pedido1.UnidadesArticulo Pedido1.ImporteArticulo
.
.
Pedido1.ArticuloN Pedido1.UnidadesArticulo Pedido1.ImporteArticulo
Pedido2.NºPedido Pedido2.Proveedor Pedido2.TotalUds Pedido2.TotalImpore
Pedido2.Articulo1 Pedido2.UnidadesArticulo Pedido2.ImporteArticulo
Pedido2.Articulo2 Pedido2.UnidadesArticulo Pedido2.ImporteArticulo
Pedido2.Articulo3 Pedido2.UnidadesArticulo Pedido2.ImporteArticulo
.
.
Pedido2.ArticuloN Pedido2.UnidadesArticulo Pedido2.ImporteArticulo
.

.
PedidoN.NºPedido Pedido2.Proveedor PedidoN.TotalUds PedidoN.TotalImpore
PedidoN.Articulo1 PedidoN.UnidadesArticulo PedidoN.ImporteArticulo
PedidoN.Articulo2 PedidoN.UnidadesArticulo PedidoN.ImporteArticulo
PedidoN.Articulo3 PedidoN.UnidadesArticulo PedidoN.ImporteArticulo
.
.
PedidoN.ArticuloN PedidoN.UnidadesArticulo PedidoN.ImporteArticulo


Como ves es la típica estructura de cabecera detalle (una linea para la
cabecera y n lineas para el detalle)

Las líneas de cabecera son generadas por la Tabla1.
Las líneas de detalle son generadas por la Tabla2.

Pues bien, para resolver el problema he creado un procedure que crea una
tabla temporal:

CREATE PROCEDURE [MiProcedure] @BBDD as nvarchar(50)


CREATE TABLE #TablaTemp
(
Id int identity (1, 1) PRIMARY KEY
LineaFichero nvarchar(100)
)

Declaro un cursor

DECLARE MiCursor FOR

SELECT NPedido , Proveedor, TotalUds, TotalImporte, ClaveTabla2 FROM
[BD1].[dbo].Tabla1

OPEN MiCursor

FETCH NEXT FROM MiCursor into @a1, @a2, @a3, @a4, @a5

WHILE @@FETCH_STATUS=0
BEGIN
INSERT INTO #TablaTemp (LineaFichero) VALUES (@a1 + @a2 + @a3 + @a4)
INSERT INTO #TablaTemp (LineaFichero)
SELECT Articulo + UnidadesArticulo + ImporteArticulo FROM
[BD1].[dbo].Tabla2 WHERE ClaveTabla2=@a5

FETCH NEXT FROM MiCursor into @a1, @a2, @a3, @a4, @a5
END



De esta forma en la tabla #TablaTemp tengo las líneas ordenadas (por el
campo Id) como deben ser escritas en el fichero a generar.

La cuestión es que [BD1] debe ser variable , ya que la consulta la tengo


que
generar en las 5 bases de datos de producción, pasándole al procedure una
variable @BBDD, pero no veo la forma de hacerlo, ya que no puedo abrir el
Cursos con sp_executesql ni con execute, únicamente me lo permite con
SELECT.

Por otro lado intenté hacer un Use @BBDD, pero tampoco puedo, ya que


parece
que el uso de Use dentro de un procedure no está permitido.

En fin, que no sé como salir de aquí.

Saludos.









"Maximiliano D. A." <maxi_accotto[arroba]speedy[.]com[.]ar> escribió en el
mensaje news:Ofz1y#
> Esta bien y cual es el problema!! no te entiendo realmente!!
>
>
> Salu2
> Maxi
> Buenos Aires Argentina
> Desarrollador Microsoft 3 Estrellas .NET
> [Maxi_accotto[arroba]speedy[punto]com[punto]ar
> MSN:
>
>
> "Juan José Pinero" escribió en el mensaje
> news:c2805b$3qj$
> > Lo haría, pero la línea de cabera sólo puede tener campos de la


consulta
> de
> > cabecera y en las líneas de detalle sólo puede haber campos de la
consulta
> > de detalle.
> >
> > ¿Me puedes confirma la imposibilidad de declarar un cursor con Sql
> dinámico?
> >
> > Gracias de todas formas.
> >
> >
> >
> > Un saludo.
> >
> >
> >
> > "Maximiliano D. A." <maxi_accotto[arroba]speedy[.]com[.]ar> escribió


en
el
> > mensaje news:
> > > Bueno ahora has sido muy claro y eso me gusta!! como cosa linda es


que
> > > podemos sacar el cursor!!!
> > >
> > > Porque no intentas hacer algo asi como:
> > >
> > > Select tabla1.campos,tabla1..campos,tabla2.campos from tabla1 left
join
> > > (select campos from tabla2) tabla2 on
> > > tabla1.campo_id = tabla2.campoid
> > >
> > >
> > > esta es una forma que te puede servir, adaptalo a tus tablas.
> > >
> > > Cuando yo te hablo de sp_executesql es porque vi que querias hacer


un
> > select
> > > tipo asi:
> > >
> > > declare @mibase varchar(255)
> > >
> > > set @mibase ='maxi'
> > >
> > > Select * from @MIBASE.TABLA
> > >
> > > esto si no usas SqlDinamico no te funcionara :(
> > >
> > > Bye
> > >
> > > Salu2
> > > Maxi
> > > Buenos Aires Argentina
> > > Desarrollador Microsoft 3 Estrellas .NET
> > > [Maxi_accotto[arroba]speedy[punto]com[punto]ar
> > > MSN:
> > >
> > >
> > > "Juan José Pinero" escribió en el mensaje
> > > news:c27ue1$l3o$
> > > > Gracias por tu respuesta,
> > > >
> > > > No te he entendido bien, ¿te refieres a que abra el cursor
utilizando
> > > > sp_executesql?
> > > > En cuanto a abrir el cursor con sp_executesql ya lo he intentado,
> pero
> > me
> > > > dice que hay error de sintaxis cerca de sp_executesql.
> > > >
> > > > Esta es la cuestión por la que creo que no tengo más remedio que
> > utilizar
> > > > cursor en el procedure:
> > > >
> > > > Necesito ejecutar 2 consultas, las 2 devuelven varios registros.
Estas
> > > > consultas deberé poder realizarlas en cualquiera de las 5 bases de
> datos
> > > de
> > > > producción.
> > > >
> > > >
> > > > Consulta1 (Cabecera)
> > > > NºPedido, Proveedor, TotalUds, TotalImporte
> > > >
> > > > Consulta2 (Detalle)
> > > > Articulo, Uds, ImporteLinea
> > > >
> > > > Por cada registro de la Consulta1 obtendré varios registros de la
> > > Consulta2.
> > > >
> > > > El problema es que tengo que generar un fichero con el siguiente
> > formato:
> > > >
> > > > Consulta1.Registro1.NºPedido Consulta1.Registro1.Proveedor
> > > > Consulta1.Registro1.TotalUds Consulta1.Registro1.TotalImporte
> > > > Consulta2.Registro1.Articulo Consulta2.Registro1.Uds
> > > > Consulta2.Registro1.ImporteLinea
> > > > Consulta2.Registro2.Articulo Consulta2.Registro2.Uds
> > > > Consulta2.Registro2.ImporteLinea
> > > > Consulta2.Registro3.Articulo Consulta2.Registro3.Uds
> > > > Consulta2.Registro3.ImporteLinea
> > > > ..
> > > > ..
> > > > Consulta2.RegistroN.Articulo Consulta2.RegistroN.Uds
> > > > Consulta2.RegistroN.ImporteLinea
> > > >
> > > > Consulta1.Registro2.NºPedido Consulta1.Registro1.Proveedor
> > > > Consulta1.Registro1.TotalUds Consulta1.Registro1.TotalImporte
> > > > Consulta2.Registro1.Articulo Consulta2.Registro1.Uds
> > > > Consulta2.Registro1.ImporteLinea
> > > > Consulta2.Registro2.Articulo Consulta2.Registro2.Uds
> > > > Consulta2.Registro2.ImporteLinea
> > > > Consulta2.Registro3.Articulo Consulta2.Registro3.Uds
> > > > Consulta2.Registro3.ImporteLinea
> > > > .
> > > > .
> > > > Consulta2.RegistroN.Articulo Consulta2.RegistroN.Uds
> > > > Consulta2.RegistroN.ImporteLinea
> > > >
> > > >
> > > > Pues bien, con el cursor abro la Consulta1 y en una tabla temporal
voy
> > > > generando las líneas que necesito escribir al fichero en orden. No
> abro
> > > > cursor para la Consulta2, si no que hago un INSERT directamente en
la
> > > tabla
> > > > temporal filtrando con las claves que me devuelve el cursor de la
> > > > Consulta1.
> > > >
> > > > No conozco ninguna otra forma de resolver este problema sin


utilizar
> el
> > > > cursor.
> > > >
> > > >
> > > >
> > > > Saludos y Gracias,
> > > >
> > > >
> > > >
> > > >
> > > > "Maximiliano D. A." <maxi_accotto[arroba]speedy[.]com[.]ar>


escribió
> en
> > el
> > > > mensaje news:#qj$
> > > > > Deberias usar SqlDinamico si queres por variable pasar la BASE o
sea
> > > > > revisate en tus manuales el
> > > > >
> > > > > sp_executesql, esto podria serte util!!
> > > > >
> > > > > Ahora porque pensas usar un cursor? que necesitas hacer que no
> > > encontraste
> > > > > otra qie un cursor?
> > > > >
> > > > > Bye
> > > > >
> > > > >
> > > > > Salu2
> > > > > Maxi
> > > > > Buenos Aires Argentina
> > > > > Desarrollador Microsoft 3 Estrellas .NET
> > > > > [Maxi_accotto[arroba]speedy[punto]com[punto]ar
> > > > > MSN:
> > > > >
> > > > >
> > > > > "Juan José Pinero" escribió en el mensaje
> > > > > news:c27s7q$4o3$
> > > > > > Hola Grupo,
> > > > > >
> > > > > > Estoy haciendo un procedure y necesito abrir un cursor


(perdonad
> los
> > > > > > detractores de los cursores, pero el fín justifica los medios)
que
> > > > apunte
> > > > > a
> > > > > > una de las 5 Bases de datos de que dispongo(BD1, BD2, BD3, BD4


y
> > BD5).
> > > > Al
> > > > > > procedure le paso la variable @BBDD sobre la que quiero


realizar
> la
> > > > > > consulta.
> > > > > >
> > > > > > Opción 1:
> > > > > > Use BD3
> > > > > >
> > > > > > El problema es que se produce un error que informa que no


se
> > puede
> > > > > > utilizar Use en procedure
> > > > > >
> > > > > > Opción 2:
> > > > > > Declare @MiTabla nvarchar(100)
> > > > > > Set @MiTabla = '[' + @BBDD + '].[dbo].[MiTablaComun]'
> > > > > > Declare MiCursor CURSOR FOR
> > > > > >
> > > > > > SELECT *FROM @MiTabla
> > > > > > OPEN MiCursor
> > > > > >
> > > > > > En este caso me dice que debo declarar la variable


@MiTabla
> > > > > >
> > > > > >
> > > > > > No entiendo qué pasa. ¿Qué estoy haciendo mal?
> > > > > >
> > > > > > Gracias de antemano.
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > > >
> > > > > Outgoing mail is certified Virus Free.
> > > > > Checked by AVG anti-virus system (http://www.grisoft.com).
> > > > > Version: 6.0.593 / Virus Database: 376 - Release Date:


20/02/2004
> > > > >
> > > > >
> > > >
> > > >
> > > >
> > > >
> > >
> > >
> > >
> > > Outgoing mail is certified Virus Free.
> > > Checked by AVG anti-virus system (http://www.grisoft.com).
> > > Version: 6.0.593 / Virus Database: 376 - Release Date: 20/02/2004
> > >
> > >
> >
> >
>
>
>
> Outgoing mail is certified Virus Free.
> Checked by AVG anti-virus system (http://www.grisoft.com).
> Version: 6.0.593 / Virus Database: 376 - Release Date: 20/02/2004
>
>







Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.593 / Virus Database: 376 - Release Date: 20/02/2004
Respuesta Responder a este mensaje
#9 ulises
04/03/2004 - 21:27 | Informe spam
Con permiso de Maxi, en primer lugar no usaría el nombre
de la base de datos en forma variable, usaría el mismo
procedimiento repetido en cada una de las 5 base de datos,
ya sé que dirías que es ineficiente repetir código, pero
particularmente prefiero eso a usar sql dinámico y sus
problemas. Para lo otro, es sencillo,

creo la tabla :

CREATE TABLE #TablaTemp
(
pedido char(10), <- o lo que sea
tipo char(02) <- o lo que sea
LineaFichero nvarchar(100) )

y relleno los datos :

INSERT INTO #TablaTemp
SELECT Pedido, '01', <formas la cadena> FROM Tabla1

INSERT INTO #tablaTemp
SELECT Pedido, '02', <formas la otra cadena> FROM Tabla2

Luego obtienes el dato

SELECT LineaFichero FROM #TablaTemp ORDER BY pedido, tipo

Saludos,
Ulises

Disculpa las molestias Maximiliano.

El problema es el siguiente:

Tengo 5 bases de datos de producción. Cada una se ocupa


de una parte del
negocio, aunque la estructura de las BBDD es idéntica.

Me solicitan que genere de forma automática y diariamente


un fichero de
texto sobre los pedidos de compras con el formato


siguiente:


Pedido1.NºPedido Pedido1.Proveedor Pedido1.TotalUds


Pedido1.TotalImpore
Pedido1.Articulo1 Pedido1.UnidadesArticulo


Pedido1.ImporteArticulo
Pedido1.Articulo2 Pedido1.UnidadesArticulo


Pedido1.ImporteArticulo
Pedido1.Articulo3 Pedido1.UnidadesArticulo


Pedido1.ImporteArticulo
..
..
Pedido1.ArticuloN Pedido1.UnidadesArticulo


Pedido1.ImporteArticulo
Pedido2.NºPedido Pedido2.Proveedor Pedido2.TotalUds


Pedido2.TotalImpore
Pedido2.Articulo1 Pedido2.UnidadesArticulo


Pedido2.ImporteArticulo
Pedido2.Articulo2 Pedido2.UnidadesArticulo


Pedido2.ImporteArticulo
Pedido2.Articulo3 Pedido2.UnidadesArticulo


Pedido2.ImporteArticulo
..
..
Pedido2.ArticuloN Pedido2.UnidadesArticulo


Pedido2.ImporteArticulo
..
.
..
PedidoN.NºPedido Pedido2.Proveedor PedidoN.TotalUds


PedidoN.TotalImpore
PedidoN.Articulo1 PedidoN.UnidadesArticulo


PedidoN.ImporteArticulo
PedidoN.Articulo2 PedidoN.UnidadesArticulo


PedidoN.ImporteArticulo
PedidoN.Articulo3 PedidoN.UnidadesArticulo


PedidoN.ImporteArticulo
..
..
PedidoN.ArticuloN PedidoN.UnidadesArticulo


PedidoN.ImporteArticulo


Como ves es la típica estructura de cabecera detalle (una


linea para la
cabecera y n lineas para el detalle)

Las líneas de cabecera son generadas por la Tabla1.
Las líneas de detalle son generadas por la Tabla2.

Pues bien, para resolver el problema he creado un


procedure que crea una
tabla temporal:

CREATE PROCEDURE [MiProcedure] @BBDD as nvarchar(50)


CREATE TABLE #TablaTemp
(
Id int identity (1, 1) PRIMARY KEY
LineaFichero nvarchar(100)
)

Declaro un cursor

DECLARE MiCursor FOR

SELECT NPedido , Proveedor, TotalUds, TotalImporte,


ClaveTabla2 FROM
[BD1].[dbo].Tabla1

OPEN MiCursor

FETCH NEXT FROM MiCursor into @a1, @a2, @a3, @a4, @a5

WHILE @@FETCH_STATUS=0
BEGIN
INSERT INTO #TablaTemp (LineaFichero) VALUES (@a1 +


@a2 + @a3 + @a4)
INSERT INTO #TablaTemp (LineaFichero)
SELECT Articulo + UnidadesArticulo +


ImporteArticulo FROM
[BD1].[dbo].Tabla2 WHERE ClaveTabla2=@a5

FETCH NEXT FROM MiCursor into @a1, @a2, @a3, @a4, @a5
END



De esta forma en la tabla #TablaTemp tengo las líneas


ordenadas (por el
campo Id) como deben ser escritas en el fichero a generar.

La cuestión es que [BD1] debe ser variable , ya que la


consulta la tengo que
generar en las 5 bases de datos de producción, pasándole


al procedure una
variable @BBDD, pero no veo la forma de hacerlo, ya que


no puedo abrir el
Cursos con sp_executesql ni con execute, únicamente me lo


permite con
SELECT.

Por otro lado intenté hacer un Use @BBDD, pero tampoco


puedo, ya que parece
que el uso de Use dentro de un procedure no está


permitido.

En fin, que no sé como salir de aquí.

Saludos.









"Maximiliano D. A." <maxi_accotto[arroba]speedy[.]com[.]


ar> escribió en el
mensaje news:Ofz1y#
Esta bien y cual es el problema!! no te entiendo




realmente!!


Salu2

Maxi
Buenos Aires Argentina
Desarrollador Microsoft 3 Estrellas .NET
[Maxi_accotto[arroba]speedy[punto]com[punto]ar
MSN:



"Juan José Pinero" escribió




en el mensaje
news:c2805b$3qj$




data.net...
> Lo haría, pero la línea de cabera sólo puede tener




campos de la consulta
de
> cabecera y en las líneas de detalle sólo puede haber




campos de la
consulta
> de detalle.
>
> ¿Me puedes confirma la imposibilidad de declarar un




cursor con Sql
dinámico?
>
> Gracias de todas formas.
>
>
>
> Un saludo.
>
>
>
> "Maximiliano D. A." <maxi_accotto[arroba]speedy[.]com




[.]ar> escribió en
el
> mensaje news:
> > Bueno ahora has sido muy claro y eso me gusta!!




como cosa linda es que
> > podemos sacar el cursor!!!
> >
> > Porque no intentas hacer algo asi como:
> >
> > Select tabla1.campos,tabla1..campos,tabla2.campos




from tabla1 left
join
> > (select campos from tabla2) tabla2 on
> > tabla1.campo_id = tabla2.campoid
> >
> >
> > esta es una forma que te puede servir, adaptalo a




tus tablas.
> >
> > Cuando yo te hablo de sp_executesql es porque vi




que querias hacer un
> select
> > tipo asi:
> >
> > declare @mibase varchar(255)
> >
> > set @mibase ='maxi'
> >
> > Select * from @MIBASE.TABLA
> >
> > esto si no usas SqlDinamico no te funcionara :(
> >
> > Bye
> >
> > Salu2
> > -




-
> > Maxi
> > Buenos Aires Argentina
> > Desarrollador Microsoft 3 Estrellas .NET
> > [Maxi_accotto[arroba]speedy[punto]com[punto]ar
> > MSN:
> > -




-
> >
> >
> > "Juan José Pinero" escribió




en el mensaje
> > news:c27ue1$l3o$




data.net...
> > > Gracias por tu respuesta,
> > >
> > > No te he entendido bien, ¿te refieres a que abra




el cursor
utilizando
> > > sp_executesql?
> > > En cuanto a abrir el cursor con sp_executesql ya




lo he intentado,
pero
> me
> > > dice que hay error de sintaxis cerca de




sp_executesql.
> > >
> > > Esta es la cuestión por la que creo que no tengo




más remedio que
> utilizar
> > > cursor en el procedure:
> > >
> > > Necesito ejecutar 2 consultas, las 2 devuelven




varios registros.
Estas
> > > consultas deberé poder realizarlas en cualquiera




de las 5 bases de
datos
> > de
> > > producción.
> > >
> > >
> > > Consulta1 (Cabecera)
> > > NºPedido, Proveedor, TotalUds, TotalImporte
> > >
> > > Consulta2 (Detalle)
> > > Articulo, Uds, ImporteLinea
> > >
> > > Por cada registro de la Consulta1 obtendré varios




registros de la
> > Consulta2.
> > >
> > > El problema es que tengo que generar un fichero




con el siguiente
> formato:
> > >
> > > Consulta1.Registro1.NºPedido




Consulta1.Registro1.Proveedor
> > > Consulta1.Registro1.TotalUds




Consulta1.Registro1.TotalImporte
> > > Consulta2.Registro1.Articulo




Consulta2.Registro1.Uds
> > > Consulta2.Registro1.ImporteLinea
> > > Consulta2.Registro2.Articulo




Consulta2.Registro2.Uds
> > > Consulta2.Registro2.ImporteLinea
> > > Consulta2.Registro3.Articulo




Consulta2.Registro3.Uds
> > > Consulta2.Registro3.ImporteLinea
> > > ..
> > > ..
> > > Consulta2.RegistroN.Articulo




Consulta2.RegistroN.Uds
> > > Consulta2.RegistroN.ImporteLinea
> > >
> > > Consulta1.Registro2.NºPedido




Consulta1.Registro1.Proveedor
> > > Consulta1.Registro1.TotalUds




Consulta1.Registro1.TotalImporte
> > > Consulta2.Registro1.Articulo




Consulta2.Registro1.Uds
> > > Consulta2.Registro1.ImporteLinea
> > > Consulta2.Registro2.Articulo




Consulta2.Registro2.Uds
> > > Consulta2.Registro2.ImporteLinea
> > > Consulta2.Registro3.Articulo




Consulta2.Registro3.Uds
> > > Consulta2.Registro3.ImporteLinea
> > > .
> > > .
> > > Consulta2.RegistroN.Articulo




Consulta2.RegistroN.Uds
> > > Consulta2.RegistroN.ImporteLinea
> > >
> > >
> > > Pues bien, con el cursor abro la Consulta1 y en




una tabla temporal
voy
> > > generando las líneas que necesito escribir al




fichero en orden. No
abro
> > > cursor para la Consulta2, si no que hago un




INSERT directamente en
la
> > tabla
> > > temporal filtrando con las claves que me




devuelve el cursor de la
> > > Consulta1.
> > >
> > > No conozco ninguna otra forma de resolver este




problema sin utilizar
el
> > > cursor.
> > >
> > >
> > >
> > > Saludos y Gracias,
> > >
> > >
> > >
> > >
> > > "Maximiliano D. A." <maxi_accotto[arroba]speedy[.]




com[.]ar> escribió
en
> el
> > > mensaje




news:#qj$
> > > > Deberias usar SqlDinamico si queres por




variable pasar la BASE o
sea
> > > > revisate en tus manuales el
> > > >
> > > > sp_executesql, esto podria serte util!!
> > > >
> > > > Ahora porque pensas usar un cursor? que




necesitas hacer que no
> > encontraste
> > > > otra qie un cursor?
> > > >
> > > > Bye
> > > >
> > > >
> > > > Salu2
> > > >
> > > > Maxi
> > > > Buenos Aires Argentina
> > > > Desarrollador Microsoft 3 Estrellas .NET
> > > > [Maxi_accotto[arroba]speedy[punto]com[punto]ar
> > > > MSN:
> > > >
> > > >
> > > >
> > > > "Juan José Pinero"




escribió en el mensaje
> > > > news:c27s7q$4o3$




gest.nuria.telefonica-data.net...
> > > > > Hola Grupo,
> > > > >
> > > > > Estoy haciendo un procedure y necesito abrir




un cursor (perdonad
los
> > > > > detractores de los cursores, pero el fín




justifica los medios)
que
> > > apunte
> > > > a
> > > > > una de las 5 Bases de datos de que dispongo




(BD1, BD2, BD3, BD4 y
> BD5).
> > > Al
> > > > > procedure le paso la variable @BBDD sobre la




que quiero realizar
la
> > > > > consulta.
> > > > >
> > > > > Opción 1:
> > > > > Use BD3
> > > > >
> > > > > El problema es que se produce un error




que informa que no se
> puede
> > > > > utilizar Use en procedure
> > > > >
> > > > > Opción 2:
> > > > > Declare @MiTabla nvarchar(100)
> > > > > Set @MiTabla = '[' + @BBDD + '].[dbo].




[MiTablaComun]'
> > > > > Declare MiCursor CURSOR FOR
> > > > >
> > > > > SELECT *FROM @MiTabla
> > > > > OPEN MiCursor
> > > > >
> > > > > En este caso me dice que debo declarar la




variable @MiTabla
> > > > >
> > > > >
> > > > > No entiendo qué pasa. ¿Qué estoy haciendo mal?
> > > > >
> > > > > Gracias de antemano.
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > >
> > > >
> > > >
> > > > Outgoing mail is certified Virus Free.
> > > > Checked by AVG anti-virus system




(http://www.grisoft.com).
> > > > Version: 6.0.593 / Virus Database: 376 -




Release Date: 20/02/2004
> > > >
> > > >
> > >
> > >
> > >
> > >
> >
> >
> >
> > Outgoing mail is certified Virus Free.
> > Checked by AVG anti-virus system




(http://www.grisoft.com).
> > Version: 6.0.593 / Virus Database: 376 - Release




Date: 20/02/2004
> >
> >
>
>



Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system




(http://www.grisoft.com).
Version: 6.0.593 / Virus Database: 376 - Release Date:




20/02/2004






.

Respuesta Responder a este mensaje
#10 Javier Loria
05/03/2004 - 01:51 | Informe spam
Hola:
La desicion de tener 5 BD es cuestionable, pero este es solo uno de
los problemas. El problema mas importante parece ser el fichero, este
formato es "raro". Porque es demasiado "feo" para que lo lea un usuario (no
tiene formato) y la mayoria de las herramientas de importacion no pueden
leerlo porque no mantiene un esquema de columna congruentes. Deberias
considerar exportar un archivo XML.
Si a pesar de todo NECESITAS este formato quedan 2 problemas pendientes
para generarlos desde SQL: 1) Las "filas" no tienen los mismos atributos,
que resolviste de forma elegante con la concatenacion de los campos y 2) Que
requiere un orden especifico que resolviste de forma "horrible" con la
combinacion del Cursor, Temporal e Identity. Solo falto ponerle a la tabla
el de nombre 666 :)
En realidad no necesitas ni el cursor, ni la Tabla Temporal ni el
Identity, puedes tratar algo como:
SELECT Linea
FROM (SELECT CAST(Pedido.NoPedido AS VARCHAR(80))
+', '+ CAST(Pedido.Proveedor AS VARCHAR(80))
+', '+ CAST(Pedido.TotalUds AS VARCHAR(80))
+', '+ CAST(Pedido1.TotalImpore AS VARCHAR(80))
AS Linea
, Pedido.NoPedido
, -1 AS Articulo -- Valor Imposible de Articulo menor
FROM Pedidos
WHERE <Condicion Pedido>
UNION ALL
SELECT CAST(DetallePedidos.Articulo AS VARCHAR(80))
+', '
+ CAST(DetallePedidos.UnidadesArticulo AS VARCHAR(80))
+', '
+ CAST(DetallePedidos.ImporteArticulo AS VARCHAR(80))
, DetallePedidos.NoPedido
, DetallePedidos.Articulo
FROM DetallePedidos
JOIN Pedidos
ON DetallePedidos.NoPedido=Pedidos.NoPedido
WHERE <Condicion Pedido>
) AS Lineas
ORDER BY Pedido, Articulo
Esto podria ser, o una Vista o una Funcion de Tabla en Linea; definida en
cada Base de Datos. Por ultimo el problema de las BD es solo construir el
SELECT como:
SELECT Linea
FROM BD1.dbo.MiVista
UNION ALL
SELECT Linea
FROM BD2.dbo.MiVista
UNION ALL
SELECT Linea
FROM BD3.dbo.MiVista
UNION ALL
SELECT Linea
FROM BD4.dbo.MiVista
UNION ALL
SELECT Linea
FROM BD5.dbo.MiVista
Espero te sirva,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Juan José Pinero escribio:
Disculpa las molestias Maximiliano.

El problema es el siguiente:

Tengo 5 bases de datos de producción. Cada una se ocupa de una parte
del negocio, aunque la estructura de las BBDD es idéntica.

Me solicitan que genere de forma automática y diariamente un fichero
de texto sobre los pedidos de compras con el formato siguiente:


Pedido1.NºPedido Pedido1.Proveedor Pedido1.TotalUds
Pedido1.TotalImpore Pedido1.Articulo1 Pedido1.UnidadesArticulo
Pedido1.ImporteArticulo Pedido1.Articulo2 Pedido1.UnidadesArticulo
Pedido1.ImporteArticulo Pedido1.Articulo3 Pedido1.UnidadesArticulo
Pedido1.ImporteArticulo .
.
Pedido1.ArticuloN Pedido1.UnidadesArticulo Pedido1.ImporteArticulo
Pedido2.NºPedido Pedido2.Proveedor Pedido2.TotalUds
Pedido2.TotalImpore Pedido2.Articulo1 Pedido2.UnidadesArticulo
Pedido2.ImporteArticulo Pedido2.Articulo2 Pedido2.UnidadesArticulo
Pedido2.ImporteArticulo Pedido2.Articulo3 Pedido2.UnidadesArticulo
Pedido2.ImporteArticulo .
.
Pedido2.ArticuloN Pedido2.UnidadesArticulo Pedido2.ImporteArticulo
.

.
PedidoN.NºPedido Pedido2.Proveedor PedidoN.TotalUds
PedidoN.TotalImpore PedidoN.Articulo1 PedidoN.UnidadesArticulo
PedidoN.ImporteArticulo PedidoN.Articulo2 PedidoN.UnidadesArticulo
PedidoN.ImporteArticulo PedidoN.Articulo3 PedidoN.UnidadesArticulo
PedidoN.ImporteArticulo .
.
PedidoN.ArticuloN PedidoN.UnidadesArticulo PedidoN.ImporteArticulo


Como ves es la típica estructura de cabecera detalle (una linea para
la cabecera y n lineas para el detalle)

Las líneas de cabecera son generadas por la Tabla1.
Las líneas de detalle son generadas por la Tabla2.

Pues bien, para resolver el problema he creado un procedure que crea
una tabla temporal:

CREATE PROCEDURE [MiProcedure] @BBDD as nvarchar(50)


CREATE TABLE #TablaTemp
(
Id int identity (1, 1) PRIMARY KEY
LineaFichero nvarchar(100)
)

Declaro un cursor

DECLARE MiCursor FOR

SELECT NPedido , Proveedor, TotalUds, TotalImporte, ClaveTabla2 FROM
[BD1].[dbo].Tabla1

OPEN MiCursor

FETCH NEXT FROM MiCursor into @a1, @a2, @a3, @a4, @a5

WHILE @@FETCH_STATUS=0
BEGIN
INSERT INTO #TablaTemp (LineaFichero) VALUES (@a1 + @a2 + @a3 +
@a4) INSERT INTO #TablaTemp (LineaFichero)
SELECT Articulo + UnidadesArticulo + ImporteArticulo FROM
[BD1].[dbo].Tabla2 WHERE ClaveTabla2=@a5

FETCH NEXT FROM MiCursor into @a1, @a2, @a3, @a4, @a5
END



De esta forma en la tabla #TablaTemp tengo las líneas ordenadas (por
el campo Id) como deben ser escritas en el fichero a generar.

La cuestión es que [BD1] debe ser variable , ya que la consulta la
tengo que generar en las 5 bases de datos de producción, pasándole al
procedure una variable @BBDD, pero no veo la forma de hacerlo, ya que
no puedo abrir el Cursos con sp_executesql ni con execute, únicamente
me lo permite con SELECT.

Por otro lado intenté hacer un Use @BBDD, pero tampoco puedo, ya que
parece que el uso de Use dentro de un procedure no está permitido.

En fin, que no sé como salir de aquí.

Saludos.









"Maximiliano D. A." <maxi_accotto[arroba]speedy[.]com[.]ar> escribió
en el mensaje news:Ofz1y#
Esta bien y cual es el problema!! no te entiendo realmente!!


Salu2
Maxi
Buenos Aires Argentina
Desarrollador Microsoft 3 Estrellas .NET
[Maxi_accotto[arroba]speedy[punto]com[punto]ar
MSN:


"Juan José Pinero" escribió en el mensaje
news:c2805b$3qj$
Lo haría, pero la línea de cabera sólo puede tener campos de la
consulta de cabecera y en las líneas de detalle sólo puede haber
campos de la consulta de detalle.

¿Me puedes confirma la imposibilidad de declarar un cursor con Sql
dinámico?

Gracias de todas formas.



Un saludo.



"Maximiliano D. A." <maxi_accotto[arroba]speedy[.]com[.]ar>
escribió en el mensaje news:
Bueno ahora has sido muy claro y eso me gusta!! como cosa linda es
que podemos sacar el cursor!!!

Porque no intentas hacer algo asi como:

Select tabla1.campos,tabla1..campos,tabla2.campos from tabla1 left
join (select campos from tabla2) tabla2 on
tabla1.campo_id = tabla2.campoid


esta es una forma que te puede servir, adaptalo a tus tablas.

Cuando yo te hablo de sp_executesql es porque vi que querias hacer
un select tipo asi:

declare @mibase varchar(255)

set @mibase ='maxi'

Select * from @MIBASE.TABLA

esto si no usas SqlDinamico no te funcionara :(

Bye

Salu2
Maxi
Buenos Aires Argentina
Desarrollador Microsoft 3 Estrellas .NET
[Maxi_accotto[arroba]speedy[punto]com[punto]ar
MSN:


"Juan José Pinero" escribió en el mensaje
news:c27ue1$l3o$
Gracias por tu respuesta,

No te he entendido bien, ¿te refieres a que abra el cursor
utilizando sp_executesql?
En cuanto a abrir el cursor con sp_executesql ya lo he
intentado, pero me dice que hay error de sintaxis cerca de
sp_executesql.

Esta es la cuestión por la que creo que no tengo más remedio que
utilizar cursor en el procedure:

Necesito ejecutar 2 consultas, las 2 devuelven varios registros.
Estas consultas deberé poder realizarlas en cualquiera de las 5
bases de datos de producción.


Consulta1 (Cabecera)
NºPedido, Proveedor, TotalUds, TotalImporte

Consulta2 (Detalle)
Articulo, Uds, ImporteLinea

Por cada registro de la Consulta1 obtendré varios registros de la
Consulta2.

El problema es que tengo que generar un fichero con el siguiente
formato:

Consulta1.Registro1.NºPedido Consulta1.Registro1.Proveedor
Consulta1.Registro1.TotalUds Consulta1.Registro1.TotalImporte
Consulta2.Registro1.Articulo Consulta2.Registro1.Uds
Consulta2.Registro1.ImporteLinea
Consulta2.Registro2.Articulo Consulta2.Registro2.Uds
Consulta2.Registro2.ImporteLinea
Consulta2.Registro3.Articulo Consulta2.Registro3.Uds
Consulta2.Registro3.ImporteLinea
..
..
Consulta2.RegistroN.Articulo Consulta2.RegistroN.Uds
Consulta2.RegistroN.ImporteLinea

Consulta1.Registro2.NºPedido Consulta1.Registro1.Proveedor
Consulta1.Registro1.TotalUds Consulta1.Registro1.TotalImporte
Consulta2.Registro1.Articulo Consulta2.Registro1.Uds
Consulta2.Registro1.ImporteLinea
Consulta2.Registro2.Articulo Consulta2.Registro2.Uds
Consulta2.Registro2.ImporteLinea
Consulta2.Registro3.Articulo Consulta2.Registro3.Uds
Consulta2.Registro3.ImporteLinea
.
.
Consulta2.RegistroN.Articulo Consulta2.RegistroN.Uds
Consulta2.RegistroN.ImporteLinea


Pues bien, con el cursor abro la Consulta1 y en una tabla
temporal voy generando las líneas que necesito escribir al
fichero en orden. No abro cursor para la Consulta2, si no que
hago un INSERT directamente en la tabla temporal filtrando con
las claves que me devuelve el cursor de la Consulta1.

No conozco ninguna otra forma de resolver este problema sin
utilizar el cursor.



Saludos y Gracias,




"Maximiliano D. A." <maxi_accotto[arroba]speedy[.]com[.]ar>
escribió en el mensaje
news:#qj$
Deberias usar SqlDinamico si queres por variable pasar la BASE o
sea revisate en tus manuales el

sp_executesql, esto podria serte util!!

Ahora porque pensas usar un cursor? que necesitas hacer que no
encontraste otra qie un cursor?

Bye


Salu2
Maxi
Buenos Aires Argentina
Desarrollador Microsoft 3 Estrellas .NET
[Maxi_accotto[arroba]speedy[punto]com[punto]ar
MSN:


"Juan José Pinero" escribió en el mensaje
news:c27s7q$4o3$
Hola Grupo,

Estoy haciendo un procedure y necesito abrir un cursor
(perdonad los detractores de los cursores, pero el fín
justifica los medios)












que
apunte
a
una de las 5 Bases de datos de que dispongo(BD1, BD2, BD3, BD4
y BD5). Al procedure le paso la variable @BBDD sobre la que
quiero realizar la consulta.

Opción 1:
Use BD3

El problema es que se produce un error que informa que no
se puede utilizar Use en procedure

Opción 2:
Declare @MiTabla nvarchar(100)
Set @MiTabla = '[' + @BBDD + '].[dbo].[MiTablaComun]'
Declare MiCursor CURSOR FOR

SELECT *FROM @MiTabla
OPEN MiCursor

En este caso me dice que debo declarar la variable @MiTabla


No entiendo qué pasa. ¿Qué estoy haciendo mal?

Gracias de antemano.



















Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.593 / Virus Database: 376 - Release Date: 20/02/2004













Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.593 / Virus Database: 376 - Release Date: 20/02/2004











Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.593 / Virus Database: 376 - Release Date: 20/02/2004
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida