Ayuda con cursor

13/02/2007 - 21:15 por Rosario | Informe spam
Que tal, alguien me puede ayudar en esto, tengo este cursor el cual se
ejecuta casi bien y digo casi por que la parte del INSERT que es la que
me importa no funciona, espero y alguien me pueda decir en que estoy mal.

Muchas gracias por cualquier ayuda.




DECLARE @refnbr varchar(6)

DECLARE doctos_referencia CURSOR FOR

SELECT RefNbr from vmvwCobranzaVendedores
WHERE perpost in ('200612','200611','200610') and slsperid='35'

OPEN doctos_referencia

FETCH NEXT FROM doctos_referencia

INTO @refnbr

WHILE @@FETCH_STATUS = 0

BEGIN

PRINT @refnbr

INSERT INTO com_referencia_doctos (id_calculo,docto_referencia,
tabla_referencia, monto, ponderacion_dias)
VALUES (2747,@refnbr,'tabla1',0, 0)

FETCH NEXT FROM doctos_referencia
INTO @refnbr

END

CLOSE doctos_referencia
DEALLOCATE doctos_referencia

Preguntas similare

Leer las respuestas

#6 Rosario
14/02/2007 - 03:43 | Informe spam
Alejandro Mesa escribió:
Rosario,

Segun lo que comentas, no hace falta usar un cursor. Puedes hacer el insert
atraves de una select.

Ejemplo:

declare @nombre_tabla varchar(10)

set @nombre_tabla='Cobranza'

INSERT INTO com_referencia_doctos (
id_calculo,
docto_referencia,
tabla_referencia,
monto,
ponderacion_dias
)
SELECT
2747,
RefNbr,
@nombre_tabla,
total,
0
from
solmaster.herramientas.dbo.vmvwCobranzaVendedores
WHERE
perpost in ('200612','200611','200610') and slsperid='35'
go

En caso de que pases id_calculo, tabla_referencia, monto y ponderacion_dias
como parametros, usa los parametros en la sentencia "select".


AMB


"Rosario" wrote:

Jose Mariano Alvarez escribió:
Ademas de lo que dijo alejandro te sugeriria que si precisas el cursor uses
FAST_FORWARD en la declaracion del cursor,

Pero para hacer eso NO HACE FALTA un cursor

INSERT INTO com_referencia_doctos
(
id_calculo,
docto_referencia,
tabla_referencia,
monto,
ponderacion_dias
)
select
2747,
refnbr,
'tabla1',
0,
0
from vmvwCobranzaVendedores
WHERE
perpost in ('200612','200611','200610') and slsperid='35'
.

.



Que tal, muchas gracias por la ayuda, pero resulta que los campos
id_calculo, tabla_referencia, monto y ponderacion_dias son externos a la
tabla vmvwCobranzaVendedores, estos los vouy a pasar yo como parámetros.

Saludos.





Ok. Muchas gracias por la ayuda, el día de mañana lo intentaré como me
comentas. Y ya que estamos en esto, el hacer el "INSERT INTO...SELECT"
tiene mejor desempeño que usar cursores? en que caso se recomienda usa
cursores?

Por otra parte, que es mas conveniente, usar en un solo store procedure
mi código de unas 100 líneas aprox. o dividirlo en partes (en mi caso
serían 3 procedures)? que tiene mejor desempeño todo en uno o en partes?

Muchas graciias.
Respuesta Responder a este mensaje
#7 Jose Mariano Alvarez
14/02/2007 - 12:37 | Informe spam
El Insert select es mucho mas eficiente que el cursor.
Siempre es recomendable evitar los cursores. Debes usarlos solo cuando no
quede otra alternativa.
Si funcionalmente tiene sentido te conviene dividirlo al igual que en
cualquier lenguaje de programacion sino deja todo junto.





Saludos
Ing. Jose Mariano Alvarez


(Cambia los ceros por O y saca lo que sobra)




"Rosario" wrote in message
news:u3NO3J%
Alejandro Mesa escribió:
Rosario,

Segun lo que comentas, no hace falta usar un cursor. Puedes hacer el
insert atraves de una select.

Ejemplo:

declare @nombre_tabla varchar(10)

set @nombre_tabla='Cobranza'

INSERT INTO com_referencia_doctos (
id_calculo,
docto_referencia, tabla_referencia,
monto,
ponderacion_dias
)
SELECT
2747,
RefNbr,
@nombre_tabla,
total,
0
from
solmaster.herramientas.dbo.vmvwCobranzaVendedores
WHERE
perpost in ('200612','200611','200610') and slsperid='35'
go

En caso de que pases id_calculo, tabla_referencia, monto y
ponderacion_dias como parametros, usa los parametros en la sentencia
"select".


AMB


"Rosario" wrote:

Jose Mariano Alvarez escribió:
Ademas de lo que dijo alejandro te sugeriria que si precisas el cursor
uses FAST_FORWARD en la declaracion del cursor,

Pero para hacer eso NO HACE FALTA un cursor

INSERT INTO com_referencia_doctos
(
id_calculo,
docto_referencia,
tabla_referencia,
monto,
ponderacion_dias
)
select
2747,
refnbr,
'tabla1',
0,
0
from vmvwCobranzaVendedores
WHERE
perpost in ('200612','200611','200610') and slsperid='35'
.

.



Que tal, muchas gracias por la ayuda, pero resulta que los campos
id_calculo, tabla_referencia, monto y ponderacion_dias son externos a la
tabla vmvwCobranzaVendedores, estos los vouy a pasar yo como parámetros.

Saludos.





Ok. Muchas gracias por la ayuda, el día de mañana lo intentaré como me
comentas. Y ya que estamos en esto, el hacer el "INSERT INTO...SELECT"
tiene mejor desempeño que usar cursores? en que caso se recomienda usa
cursores?

Por otra parte, que es mas conveniente, usar en un solo store procedure mi
código de unas 100 líneas aprox. o dividirlo en partes (en mi caso serían
3 procedures)? que tiene mejor desempeño todo en uno o en partes?

Muchas graciias.



Respuesta Responder a este mensaje
#8 Rosario
14/02/2007 - 17:37 | Informe spam
Jose Mariano Alvarez escribió:
El Insert select es mucho mas eficiente que el cursor.
Siempre es recomendable evitar los cursores. Debes usarlos solo cuando no
quede otra alternativa.
Si funcionalmente tiene sentido te conviene dividirlo al igual que en
cualquier lenguaje de programacion sino deja todo junto.





Hola,

Así quedaría mi INSERT

DECLARE @nombre_tabla varchar(15), @id_calculo int

set @nombre_tabla='Cobranza'
set @id_calculo750

INSERT INTO com_referencia_doctos (
id_calculo,
docto_referencia,
tabla_referencia,
monto,
ponderacion_dias
)
SELECT
@id_calculo,
RefNbr,
@nombre_tabla,
0,
0
from
solmaster.herramientas.dbo.vmvwCobranzaVendedores
WHERE
perpost in ('200612','200611','200610') and slsperid='35'


Pero al ejecutarlo me marca el siguiente error:

Server: Msg 7391, Level 16, State 1, Line 8
The operation could not be performed because the OLE DB provider
'SQLOLEDB' was unable to begin a distributed transaction.
[OLE/DB provider returned message: No se puede dar de alta la nueva
transacción en el coordinador de transacciones especificado. ]


ya busqué este error en internet y ha hice lo que dice la página de
microsoft y esto sigue igual.

Como te pudiste dar cuenta estoy usando un linked server (solmaster) el
cual esta un un Windows 2000 y yo utilizo WinXP SP2 y es en este último
donde hice lo que iindica microsoft, mi pregunta es tengo que hacer lo
mismo que hice en XP en mi servidor Win2000?

Gracias.
Respuesta Responder a este mensaje
#9 Jose Mariano Alvarez
14/02/2007 - 20:47 | Informe spam
Asegurate de que los DTC esten corriendo en ambos equipos y que las cuentas
usadas sean de adecuadas para poder realizar la transaccion.
Ojo que el documento de soporte dice DTS y esta mal.debe decir DTC




Saludos
Ing. Jose Mariano Alvarez


(Cambia los ceros por O y saca lo que sobra)




"Rosario" wrote in message
news:
Jose Mariano Alvarez escribió:
El Insert select es mucho mas eficiente que el cursor.
Siempre es recomendable evitar los cursores. Debes usarlos solo cuando no
quede otra alternativa.
Si funcionalmente tiene sentido te conviene dividirlo al igual que en
cualquier lenguaje de programacion sino deja todo junto.





Hola,

Así quedaría mi INSERT

DECLARE @nombre_tabla varchar(15), @id_calculo int

set @nombre_tabla='Cobranza'
set @id_calculo750

INSERT INTO com_referencia_doctos (
id_calculo,
docto_referencia,
tabla_referencia,
monto,
ponderacion_dias
)
SELECT
@id_calculo,
RefNbr,
@nombre_tabla,
0,
0
from
solmaster.herramientas.dbo.vmvwCobranzaVendedores
WHERE
perpost in ('200612','200611','200610') and slsperid='35'


Pero al ejecutarlo me marca el siguiente error:

Server: Msg 7391, Level 16, State 1, Line 8
The operation could not be performed because the OLE DB provider
'SQLOLEDB' was unable to begin a distributed transaction.
[OLE/DB provider returned message: No se puede dar de alta la nueva
transacción en el coordinador de transacciones especificado. ]


ya busqué este error en internet y ha hice lo que dice la página de
microsoft y esto sigue igual.

Como te pudiste dar cuenta estoy usando un linked server (solmaster) el
cual esta un un Windows 2000 y yo utilizo WinXP SP2 y es en este último
donde hice lo que iindica microsoft, mi pregunta es tengo que hacer lo
mismo que hice en XP en mi servidor Win2000?

Gracias.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida