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$
Mostrar la cita
de
Mostrar la cita
dinámico?
Mostrar la cita
pero
Mostrar la cita
datos
Mostrar la cita
abro
Mostrar la cita
el
Mostrar la cita
en
Mostrar la cita
los
Mostrar la cita
la
Mostrar la cita
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
#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#
Mostrar la cita
consulta
Mostrar la cita
el
Mostrar la cita
join
Mostrar la cita
utilizando
Mostrar la cita
Estas
Mostrar la cita
voy
Mostrar la cita
la
Mostrar la cita
sea
Mostrar la cita
que
Mostrar la cita
#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$
Mostrar la cita
que
Mostrar la cita
parece
Mostrar la cita
consulta
Mostrar la cita
en
Mostrar la cita
que
Mostrar la cita
un
Mostrar la cita
utilizar
Mostrar la cita
escribió
Mostrar la cita
(perdonad
Mostrar la cita
y
Mostrar la cita
realizar
Mostrar la cita
se
Mostrar la cita
@MiTabla
Mostrar la cita
20/02/2004
Mostrar la cita
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
#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

Mostrar la cita
de una parte del
Mostrar la cita
un fichero de
Mostrar la cita
siguiente:
Mostrar la cita
Pedido1.TotalImpore
Mostrar la cita
Pedido1.ImporteArticulo
Mostrar la cita
Pedido1.ImporteArticulo
Mostrar la cita
Pedido1.ImporteArticulo
Mostrar la cita
Pedido1.ImporteArticulo
Mostrar la cita
Pedido2.TotalImpore
Mostrar la cita
Pedido2.ImporteArticulo
Mostrar la cita
Pedido2.ImporteArticulo
Mostrar la cita
Pedido2.ImporteArticulo
Mostrar la cita
Pedido2.ImporteArticulo
Mostrar la cita
PedidoN.TotalImpore
Mostrar la cita
PedidoN.ImporteArticulo
Mostrar la cita
PedidoN.ImporteArticulo
Mostrar la cita
PedidoN.ImporteArticulo
Mostrar la cita
PedidoN.ImporteArticulo
Mostrar la cita
linea para la
Mostrar la cita
procedure que crea una
Mostrar la cita
ClaveTabla2 FROM
Mostrar la cita
@a2 + @a3 + @a4)
Mostrar la cita
ImporteArticulo FROM
Mostrar la cita
ordenadas (por el
Mostrar la cita
consulta la tengo que
Mostrar la cita
al procedure una
Mostrar la cita
no puedo abrir el
Mostrar la cita
permite con
Mostrar la cita
puedo, ya que parece
Mostrar la cita
permitido.
Mostrar la cita
ar> escribió en el
Mostrar la cita
realmente!!
Mostrar la cita
en el mensaje
Mostrar la cita
data.net...
Mostrar la cita
campos de la consulta
Mostrar la cita
campos de la
Mostrar la cita
cursor con Sql
Mostrar la cita
[.]ar> escribió en
Mostrar la cita
como cosa linda es que
Mostrar la cita
from tabla1 left
Mostrar la cita
tus tablas.
Mostrar la cita
que querias hacer un
Mostrar la cita
-
Mostrar la cita
-
Mostrar la cita
en el mensaje
Mostrar la cita
data.net...
Mostrar la cita
el cursor
Mostrar la cita
lo he intentado,
Mostrar la cita
sp_executesql.
Mostrar la cita
más remedio que
Mostrar la cita
varios registros.
Mostrar la cita
de las 5 bases de
Mostrar la cita
registros de la
Mostrar la cita
con el siguiente
Mostrar la cita
Consulta1.Registro1.Proveedor
Mostrar la cita
Consulta1.Registro1.TotalImporte
Mostrar la cita
Consulta2.Registro1.Uds
Mostrar la cita
Consulta2.Registro2.Uds
Mostrar la cita
Consulta2.Registro3.Uds
Mostrar la cita
Consulta2.RegistroN.Uds
Mostrar la cita
Consulta1.Registro1.Proveedor
Mostrar la cita
Consulta1.Registro1.TotalImporte
Mostrar la cita
Consulta2.Registro1.Uds
Mostrar la cita
Consulta2.Registro2.Uds
Mostrar la cita
Consulta2.Registro3.Uds
Mostrar la cita
Consulta2.RegistroN.Uds
Mostrar la cita
una tabla temporal
Mostrar la cita
fichero en orden. No
Mostrar la cita
INSERT directamente en
Mostrar la cita
devuelve el cursor de la
Mostrar la cita
problema sin utilizar
Mostrar la cita
com[.]ar> escribió
Mostrar la cita
news:#qj$
Mostrar la cita
variable pasar la BASE o
Mostrar la cita
necesitas hacer que no
Mostrar la cita
escribió en el mensaje
Mostrar la cita
gest.nuria.telefonica-data.net...
Mostrar la cita
un cursor (perdonad
Mostrar la cita
justifica los medios)
Mostrar la cita
(BD1, BD2, BD3, BD4 y
Mostrar la cita
que quiero realizar
Mostrar la cita
que informa que no se
Mostrar la cita
[MiTablaComun]'
Mostrar la cita
variable @MiTabla
Mostrar la cita
(http://www.grisoft.com).
Mostrar la cita
Release Date: 20/02/2004
Mostrar la cita
(http://www.grisoft.com).
Mostrar la cita
Date: 20/02/2004
Mostrar la cita
(http://www.grisoft.com).
Mostrar la cita
20/02/2004
Mostrar la cita
#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:
Mostrar la cita
Ads by Google
Search Busqueda sugerida