consulta Cursores

21/12/2004 - 13:17 por Mennegguzzi | Informe spam
Hola tengo la siguiente query que estoy intentando usar para pasar registros
de una tabla a otra con la misma estructura, pero de otra base de datos:

Las bases de datos son Empresa1 y Empresa2
Las tablas se llaman igual en las dos bases: BASECLI
Los campos que quiero pasar son NROCTA, NOMBRE y VENDEDOR
El cursor se llama Clientes
La PK es NROCTA y la guardo en la variable @Codigo


DECLARE @Codigo VARCHAR (6)
DECLARE Clientes SCROLL CURSOR FOR
SELECT * FROM Empresa1.dbo.BASECLI
OPEN Clientes
FETCH FIRST FROM Clientes
WHILE @@FETCH_STATUS = 0
BEGIN
SET @Codigo = (SELECT Clientes.NROCTA FROM Clientes)
IF NOT EXISTS (SELECT * FROM Empresa2.dbo.BASECLI WHERE
Empresa2.dbo.BASECLI.NROCTA = @NROCTA)
BEGIN
INSERT INTO Empresa2.dbo.BASECLI (NOMBRE, NROCTA, VENDEDOR)
SELECT Empresa1.dbo.BASECLI.NOMBRE, Empresa1.dbo.BASECLI.NROCTA,
Empresa1.dbo.BASECLI.VENDEDOR
FROM Empresa1.dbo.BASECLI
WHERE Empresa1.dbo.BASECLI.NROCTA = @Codigo
END
FETCH NEXT FROM Clientes
END
CLOSE Clientes
DEALLOCATE Clientes


y me da el siguiente mensaje de error:

NROCTA NOMBRE
VENDEDOR
ABBOTT ABBOTT LABORATORIES ARGENTINA S.A. RC

(1 filas afectadas)

Servidor: mensaje 208, nivel 16, estado 1, línea 10
Invalid object name 'Clientes'.



La pregunta es qué estoy manejando mal, debo poner algo más al lado de la
palabra Clientes(cursor definido) para que lo identifique como tal?

Desde ya les agradezco enormemente su ayuda

Saludos

Pablo

Preguntas similare

Leer las respuestas

#1 qwalgrande
21/12/2004 - 13:37 | Informe spam
Hola.

Por favor, por el bien de tu servidor, no uses cursores, puedes hacer lo
mismo con lo siguiente (o algo muy parecido):

INSERT INTO Empresa2.dbo.BASECLI (NOMBRE, NROCTA, VENDEDOR)
select E1.NOMBRE, E1.NROCTA, E1.VENDEDOR
from Empresa1.dbo.BASECLI E1 left join Empresa2.dbo.BASECLI E2 on
E1.NROCTA = E2.NROCTA
where E2.NROCAT is null

qwalgrande

"Mennegguzzi" wrote:

Hola tengo la siguiente query que estoy intentando usar para pasar registros
de una tabla a otra con la misma estructura, pero de otra base de datos:

Las bases de datos son Empresa1 y Empresa2
Las tablas se llaman igual en las dos bases: BASECLI
Los campos que quiero pasar son NROCTA, NOMBRE y VENDEDOR
El cursor se llama Clientes
La PK es NROCTA y la guardo en la variable @Codigo


DECLARE @Codigo VARCHAR (6)
DECLARE Clientes SCROLL CURSOR FOR
SELECT * FROM Empresa1.dbo.BASECLI
OPEN Clientes
FETCH FIRST FROM Clientes
WHILE @@FETCH_STATUS = 0
BEGIN
SET @Codigo = (SELECT Clientes.NROCTA FROM Clientes)
IF NOT EXISTS (SELECT * FROM Empresa2.dbo.BASECLI WHERE
Empresa2.dbo.BASECLI.NROCTA = @NROCTA)
BEGIN
INSERT INTO Empresa2.dbo.BASECLI (NOMBRE, NROCTA, VENDEDOR)
SELECT Empresa1.dbo.BASECLI.NOMBRE, Empresa1.dbo.BASECLI.NROCTA,
Empresa1.dbo.BASECLI.VENDEDOR
FROM Empresa1.dbo.BASECLI
WHERE Empresa1.dbo.BASECLI.NROCTA = @Codigo
END
FETCH NEXT FROM Clientes
END
CLOSE Clientes
DEALLOCATE Clientes


y me da el siguiente mensaje de error:

NROCTA NOMBRE
VENDEDOR
ABBOTT ABBOTT LABORATORIES ARGENTINA S.A. RC

(1 filas afectadas)

Servidor: mensaje 208, nivel 16, estado 1, línea 10
Invalid object name 'Clientes'.



La pregunta es qué estoy manejando mal, debo poner algo más al lado de la
palabra Clientes(cursor definido) para que lo identifique como tal?

Desde ya les agradezco enormemente su ayuda

Saludos

Pablo



Respuesta Responder a este mensaje
#2 Mennegguzzi
21/12/2004 - 15:04 | Informe spam
qué problema me puede traer usar un cursor en este caso?
gracias
Pablo


"qwalgrande" <qwalgrande*nospam*@yahoo.es> escribió en el mensaje
news:
Hola.

Por favor, por el bien de tu servidor, no uses cursores, puedes hacer lo
mismo con lo siguiente (o algo muy parecido):

INSERT INTO Empresa2.dbo.BASECLI (NOMBRE, NROCTA, VENDEDOR)
select E1.NOMBRE, E1.NROCTA, E1.VENDEDOR
from Empresa1.dbo.BASECLI E1 left join Empresa2.dbo.BASECLI E2 on
E1.NROCTA = E2.NROCTA
where E2.NROCAT is null

qwalgrande

"Mennegguzzi" wrote:

Hola tengo la siguiente query que estoy intentando usar para pasar
registros
de una tabla a otra con la misma estructura, pero de otra base de datos:

Las bases de datos son Empresa1 y Empresa2
Las tablas se llaman igual en las dos bases: BASECLI
Los campos que quiero pasar son NROCTA, NOMBRE y VENDEDOR
El cursor se llama Clientes
La PK es NROCTA y la guardo en la variable @Codigo


DECLARE @Codigo VARCHAR (6)
DECLARE Clientes SCROLL CURSOR FOR
SELECT * FROM Empresa1.dbo.BASECLI
OPEN Clientes
FETCH FIRST FROM Clientes
WHILE @@FETCH_STATUS = 0
BEGIN
SET @Codigo = (SELECT Clientes.NROCTA FROM Clientes)
IF NOT EXISTS (SELECT * FROM Empresa2.dbo.BASECLI WHERE
Empresa2.dbo.BASECLI.NROCTA = @NROCTA)
BEGIN
INSERT INTO Empresa2.dbo.BASECLI (NOMBRE, NROCTA, VENDEDOR)
SELECT Empresa1.dbo.BASECLI.NOMBRE, Empresa1.dbo.BASECLI.NROCTA,
Empresa1.dbo.BASECLI.VENDEDOR
FROM Empresa1.dbo.BASECLI
WHERE Empresa1.dbo.BASECLI.NROCTA = @Codigo
END
FETCH NEXT FROM Clientes
END
CLOSE Clientes
DEALLOCATE Clientes


y me da el siguiente mensaje de error:

NROCTA NOMBRE
VENDEDOR
ABBOTT ABBOTT LABORATORIES ARGENTINA S.A. RC

(1 filas afectadas)

Servidor: mensaje 208, nivel 16, estado 1, línea 10
Invalid object name 'Clientes'.



La pregunta es qué estoy manejando mal, debo poner algo más al lado de la
palabra Clientes(cursor definido) para que lo identifique como tal?

Desde ya les agradezco enormemente su ayuda

Saludos

Pablo



Respuesta Responder a este mensaje
#3 qwalgrande
21/12/2004 - 16:15 | Informe spam
Hola.

En mi opinión (y no sólo en la mía) los cursores son un recurso a utilizar
cuando no queda más remedio. En cuanto a rendimiento son bastante deficientes
en general, por no hablar de bloqueos, recursos que consumen, tiempo de
ejecución. No quiero extenderme, pero como dicen los de la Brigada
Anticursores

"Salva a SQL, elimina un cursor"

qwalgrande.

"Mennegguzzi" wrote:

qué problema me puede traer usar un cursor en este caso?
gracias
Pablo


"qwalgrande" <qwalgrande*nospam*@yahoo.es> escribió en el mensaje
news:
> Hola.
>
> Por favor, por el bien de tu servidor, no uses cursores, puedes hacer lo
> mismo con lo siguiente (o algo muy parecido):
>
> INSERT INTO Empresa2.dbo.BASECLI (NOMBRE, NROCTA, VENDEDOR)
> select E1.NOMBRE, E1.NROCTA, E1.VENDEDOR
> from Empresa1.dbo.BASECLI E1 left join Empresa2.dbo.BASECLI E2 on
> E1.NROCTA = E2.NROCTA
> where E2.NROCAT is null
>
> qwalgrande
>
> "Mennegguzzi" wrote:
>
>> Hola tengo la siguiente query que estoy intentando usar para pasar
>> registros
>> de una tabla a otra con la misma estructura, pero de otra base de datos:
>>
>> Las bases de datos son Empresa1 y Empresa2
>> Las tablas se llaman igual en las dos bases: BASECLI
>> Los campos que quiero pasar son NROCTA, NOMBRE y VENDEDOR
>> El cursor se llama Clientes
>> La PK es NROCTA y la guardo en la variable @Codigo
>>
>>
>> DECLARE @Codigo VARCHAR (6)
>> DECLARE Clientes SCROLL CURSOR FOR
>> SELECT * FROM Empresa1.dbo.BASECLI
>> OPEN Clientes
>> FETCH FIRST FROM Clientes
>> WHILE @@FETCH_STATUS = 0
>> BEGIN
>> SET @Codigo = (SELECT Clientes.NROCTA FROM Clientes)
>> IF NOT EXISTS (SELECT * FROM Empresa2.dbo.BASECLI WHERE
>> Empresa2.dbo.BASECLI.NROCTA = @NROCTA)
>> BEGIN
>> INSERT INTO Empresa2.dbo.BASECLI (NOMBRE, NROCTA, VENDEDOR)
>> SELECT Empresa1.dbo.BASECLI.NOMBRE, Empresa1.dbo.BASECLI.NROCTA,
>> Empresa1.dbo.BASECLI.VENDEDOR
>> FROM Empresa1.dbo.BASECLI
>> WHERE Empresa1.dbo.BASECLI.NROCTA = @Codigo
>> END
>> FETCH NEXT FROM Clientes
>> END
>> CLOSE Clientes
>> DEALLOCATE Clientes
>>
>>
>> y me da el siguiente mensaje de error:
>>
>> NROCTA NOMBRE
>> VENDEDOR
>> ABBOTT ABBOTT LABORATORIES ARGENTINA S.A. RC
>>
>> (1 filas afectadas)
>>
>> Servidor: mensaje 208, nivel 16, estado 1, línea 10
>> Invalid object name 'Clientes'.
>>
>>
>>
>> La pregunta es qué estoy manejando mal, debo poner algo más al lado de la
>> palabra Clientes(cursor definido) para que lo identifique como tal?
>>
>> Desde ya les agradezco enormemente su ayuda
>>
>> Saludos
>>
>> Pablo
>>
>>
>>



Respuesta Responder a este mensaje
#4 Juan Sánchez
21/12/2004 - 17:19 | Informe spam
Para darte una idea de lo que dice qwalgrande, cuando ingresé a mi actual
trabajo, estaban en proceso de cambio de plataforma y el proceso de
migración lo habían desarrollado con solo cursores. Ejecutar todo el proceso
tomaba como 12 horas. Eliminé lo más que pude los cursores y se redujo a
casi 1 hora.

Slds,
Juan


"qwalgrande" <qwalgrande*nospam*@yahoo.es> escribió en el mensaje
news:
Hola.

En mi opinión (y no sólo en la mía) los cursores son un recurso a utilizar
cuando no queda más remedio. En cuanto a rendimiento son bastante


deficientes
en general, por no hablar de bloqueos, recursos que consumen, tiempo de
ejecución. No quiero extenderme, pero como dicen los de la Brigada
Anticursores

"Salva a SQL, elimina un cursor"

qwalgrande.

"Mennegguzzi" wrote:

> qué problema me puede traer usar un cursor en este caso?
> gracias
> Pablo
>
>
> "qwalgrande" <qwalgrande*nospam*@yahoo.es> escribió en el mensaje
> news:
> > Hola.
> >
> > Por favor, por el bien de tu servidor, no uses cursores, puedes hacer


lo
> > mismo con lo siguiente (o algo muy parecido):
> >
> > INSERT INTO Empresa2.dbo.BASECLI (NOMBRE, NROCTA, VENDEDOR)
> > select E1.NOMBRE, E1.NROCTA, E1.VENDEDOR
> > from Empresa1.dbo.BASECLI E1 left join Empresa2.dbo.BASECLI E2 on
> > E1.NROCTA = E2.NROCTA
> > where E2.NROCAT is null
> >
> > qwalgrande
> >
> > "Mennegguzzi" wrote:
> >
> >> Hola tengo la siguiente query que estoy intentando usar para pasar
> >> registros
> >> de una tabla a otra con la misma estructura, pero de otra base de


datos:
> >>
> >> Las bases de datos son Empresa1 y Empresa2
> >> Las tablas se llaman igual en las dos bases: BASECLI
> >> Los campos que quiero pasar son NROCTA, NOMBRE y VENDEDOR
> >> El cursor se llama Clientes
> >> La PK es NROCTA y la guardo en la variable @Codigo
> >>
> >>
> >> DECLARE @Codigo VARCHAR (6)
> >> DECLARE Clientes SCROLL CURSOR FOR
> >> SELECT * FROM Empresa1.dbo.BASECLI
> >> OPEN Clientes
> >> FETCH FIRST FROM Clientes
> >> WHILE @@FETCH_STATUS = 0
> >> BEGIN
> >> SET @Codigo = (SELECT Clientes.NROCTA FROM Clientes)
> >> IF NOT EXISTS (SELECT * FROM Empresa2.dbo.BASECLI WHERE
> >> Empresa2.dbo.BASECLI.NROCTA = @NROCTA)
> >> BEGIN
> >> INSERT INTO Empresa2.dbo.BASECLI (NOMBRE, NROCTA, VENDEDOR)
> >> SELECT Empresa1.dbo.BASECLI.NOMBRE, Empresa1.dbo.BASECLI.NROCTA,
> >> Empresa1.dbo.BASECLI.VENDEDOR
> >> FROM Empresa1.dbo.BASECLI
> >> WHERE Empresa1.dbo.BASECLI.NROCTA = @Codigo
> >> END
> >> FETCH NEXT FROM Clientes
> >> END
> >> CLOSE Clientes
> >> DEALLOCATE Clientes
> >>
> >>
> >> y me da el siguiente mensaje de error:
> >>
> >> NROCTA NOMBRE
> >> VENDEDOR
> >> ABBOTT ABBOTT LABORATORIES ARGENTINA S.A. RC
> >>
> >> (1 filas afectadas)
> >>
> >> Servidor: mensaje 208, nivel 16, estado 1, línea 10
> >> Invalid object name 'Clientes'.
> >>
> >>
> >>
> >> La pregunta es qué estoy manejando mal, debo poner algo más al lado


de la
> >> palabra Clientes(cursor definido) para que lo identifique como tal?
> >>
> >> Desde ya les agradezco enormemente su ayuda
> >>
> >> Saludos
> >>
> >> Pablo
> >>
> >>
> >>
>
>
>
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida