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

#11 Juan José Pinero
05/03/2004 - 19:48 | Informe spam
Gracias Maximiliano, Ulises y Javier.

La solución que me dabais tanto Maximiliano como Javier eran viables, si
bien me complicaban bastante al tener que crear las Vistas en todas las
Bases de Datos.
Ulises, tu solución, no he tenido tiempo de probarla, aunque creo que
también sería viable.
Finalmente adopté la opción de generar SQL dinámico en el procedure
declarando el cursor dentro del string que paso a sp_executesql

y . sorpresa!!:

Probé la solución que dabais Maximiliano y Javier (aplicando UNION ) sobre
una única Base de Datos y la solución de Sql dinámico con cursor (como
finalmente lo he dejado). Pues bién, sobre un tiempo de ejecución de 20
segundos que tarda la solución de UNION (sin cursor), la opción con Cursor
le gana por 5 segundos (tarda 15 segundos). Así que, pese a todo no hay que
tener tanto miedo a los cursores. Ahora bien, me anoto (bien a mano) vuestra
solución que será tenida en cuenta en futuros desarrollos. Por cierto
Javier, muy inteligente tu solución, y a la tabla temporal la he llamado
TMP_666 ;-)

Gracias por todo

Y saludos,



"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
#12 ulises
05/03/2004 - 20:51 | Informe spam
Juan,

Sería muy interesante conocer tus pruebas ya que hasta el
momento no había encontrado una prueba a favor del cursor,
en todo caso he realizado una prueba pequeña simulando tu
caso y probando dentro del mismo servidor para efectos de
no tener los ruidos de la transferencia a través de la
red :

CREATE TABLE pedido ( codigo int, descripcion char(20) )
go
CREATE TABLE detalle ( codigo int, secuencia int, glosa
char(30) )
go
INSERT INTO pedido VALUES ( 1, 'PEDIDO 1')
INSERT INTO pedido VALUES ( 2, 'PEDIDO 2')
INSERT INTO pedido VALUES ( 3, 'PEDIDO 3')
INSERT INTO pedido VALUES ( 4, 'PEDIDO 4')
INSERT INTO pedido VALUES ( 5, 'PEDIDO 5')
INSERT INTO pedido VALUES ( 6, 'PEDIDO 6')
go
INSERT INTO detalle VALUES (1, 1, 'PED1 -GLOSA1')
INSERT INTO detalle VALUES (1, 2, 'PED1 -GLOSA2')
INSERT INTO detalle VALUES (1, 3, 'PED1 -GLOSA3')
INSERT INTO detalle VALUES (1, 4, 'PED1 -GLOSA4')
INSERT INTO detalle VALUES (1, 5, 'PED1 -GLOSA5')
INSERT INTO detalle VALUES (1, 6, 'PED1 -GLOSA6')
INSERT INTO detalle VALUES (2, 1, 'PED2 -GLOSA1')
INSERT INTO detalle VALUES (2, 2, 'PED2 -GLOSA2')
INSERT INTO detalle VALUES (2, 3, 'PED2 -GLOSA3')
INSERT INTO detalle VALUES (3, 1, 'PED3 -GLOSA1')
INSERT INTO detalle VALUES (3, 2, 'PED3 -GLOSA2')
INSERT INTO detalle VALUES (4, 1, 'PED4 -GLOSA1')
INSERT INTO detalle VALUES (4, 2, 'PED4 -GLOSA2')
INSERT INTO detalle VALUES (4, 3, 'PED4 -GLOSA3')
INSERT INTO detalle VALUES (4, 4, 'PED4 -GLOSA4')
INSERT INTO detalle VALUES (4, 5, 'PED4 -GLOSA5')
INSERT INTO detalle VALUES (4, 6, 'PED4 -GLOSA6')
INSERT INTO detalle VALUES (5, 1, 'PED5 -GLOSA1')
INSERT INTO detalle VALUES (5, 2, 'PED5 -GLOSA2')
INSERT INTO detalle VALUES (5, 3, 'PED5 -GLOSA3')
INSERT INTO detalle VALUES (5, 4, 'PED5 -GLOSA4')
INSERT INTO detalle VALUES (6, 1, 'PED6 -GLOSA1')
INSERT INTO detalle VALUES (6, 2, 'PED6 -GLOSA2')
INSERT INTO detalle VALUES (6, 3, 'PED6 -GLOSA3')
go
PRINT 'Solo SELECT'
SELECT CURRENT_TIMESTAMP
go
SELECT codigo, 0 as secuencia, ( CAST(codigo as varchar
(10)) + descripcion) as cadena
FROM pedido
UNION ALL
SELECT codigo, secuencia, ( CAST(codigo as varchar(10)) +
glosa ) as cadena
FROM detalle
ORDER BY codigo, secuencia
go
SELECT CURRENT_TIMESTAMP
go
PRINT 'Uso de Cursor'
SELECT CURRENT_TIMESTAMP
go
CREATE TABLE #TablaTemp (Id int identity (1, 1) PRIMARY
KEY, LineaFichero nvarchar(100))
DECLARE @cod as int
DECLARE @des as char(20)
DECLARE @glo as char(30)
DECLARE MiCursor CURSOR FOR
SELECT codigo, descripcion FROM pedido
OPEN MiCursor
FETCH NEXT FROM MiCursor into @cod, @des
WHILE @@FETCH_STATUS=0
BEGIN
INSERT INTO #TablaTemp (LineaFichero) VALUES (CAST
(@cod as varchar(10)) + @des )
INSERT INTO #TablaTemp (LineaFichero)
SELECT ( CAST(codigo as varchar(10)) + glosa )
FROM detalle WHERE codigo = @cod
FETCH NEXT FROM MiCursor into @cod, @des
END
CLOSE MiCursor
DEALLOCATE MiCursor
SELECT LineaFichero FROM #TablaTemp ORDER BY Id
DROP TABLE #TablaTemp
go
SELECT CURRENT_TIMESTAMP
go

y me indicado que la solución con el UNION me ha demorado
0.017 segundos mientras que la de CURSOR 0.030; si aumento
la cantidad de registros a 192 pedidos y 768 detalles me
arroja un tiempo de 0.064 con el uso de UNION mientras que
con el CURSOR 0.297 segundos.

Otro tema a revisar es el uso de recursos que podriamos
medirlos con el Perfmon, pero eso lo dejo para el fin de
semana.

Saludos,
Ulises

...
Mostrar la cita
(aplicando UNION ) sobre
Mostrar la cita
cursor (como
Mostrar la cita
ejecución de 20
Mostrar la cita
opción con Cursor
Mostrar la cita
a todo no hay que
Mostrar la cita
(bien a mano) vuestra
Mostrar la cita
desarrollos. Por cierto
Mostrar la cita
temporal la he llamado
Mostrar la cita
Ads by Google
Search Busqueda sugerida