SP recursivo ¿sin fetch?

30/07/2004 - 17:30 por joselitux | Informe spam
hola

Tengo un procedimiento almacenado que debe ejecutarse para cada registro
de un campo de una tabla, pero no todos, sino solamente tras un SELECT
DISTINCT.

¿se puede hacer si cursores?
Hasta ahora todo lo que he intentado me dice que no se puede ejecutar
porque el select devuelve más de un resultado, cosa por otra parte
lógica.
¿cómo puedo hacerlo?


gracias

Preguntas similare

Leer las respuestas

#6 joselitux
03/08/2004 - 18:30 | Informe spam
Me temo que no me expresé bien.

Eso que tu dices ya lo capto, lo que ocurre es que tal y como lo planteas
tengo que hacerlo una vez para cada concepto.
Eso es lo que me evita precisamente el SP. Recupera todos los MAX, para
cada distinct concepto.

Es así donde me da el error porque segúin parece al update no se le
puede pasar un resulset de varios registros.



On Mon, 02 Aug 2004 18:13:58
-0600, Javier Loria wrote:

Hola:
Cuando se escriben programas es perfectamente natural y deseable el que
dividas en procedimientos/funciones diferentes estos procesos, pero en SQL
la forma de dividirlos es diferente :(
Por ejemplo en tu caso si el SELECT debe hacerse para obtener el ultimo
valor puedes hacerlo
> SELECT Concepto, MAX(Valor) AS Valor
FROM Contratos
> En lugar de procesar esto por separado lo "incluyes" en la el UPDATE
como parte de las tablas, por ejemplos si quisieramos restar el doble de
esta vlor de la tabla conceptos podriamos decir:
> UPDATE Conceptos
ColumnaX=ColumnaX-(2*A.Valor)
FROM Conceptos
JOIN (SELECT Concepto, MAX(Valor) AS Valor
FROM Contratos) AS A
ON Conceptos.Concepto=A.Contratos
> Es un cambio grande de mentalidad asi que espero se entienda.
Saludos,


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.



joselitux escribio:
Seré más preciso:

la tabla CONTRATOS asigna un número autoincremental por cada
concepto. O
sea, que podemos tener el 56 para tornillos , el 98 para tuercas, y
así sucesivamente.
El SP hace un SELECT DISTINCT CONCEPTO FROM CONTRATOS. De ahí recoge
el MAX(valor) del autoincremental mencionado antes. REaliza una serie
de operaciones matemáticas sobre él y devuelve otro valor numérico
que ha
de insertarse mediante update en la siguiente tabla de CONCEPTOS:

CONCEPTO UNIDADES MAXIMAS
tornillos 56
tuercas 98
...

Es un caso parecido al de tener una tabla aparte para mantener
varios indices numericos autoincrementales dentro de otra en funcion
del campo concepto.

En este momento se trata de que el procedimiento almacenado actualiza
la tabla que guarda el MAX de cada concepto leyendo en la tabla de
contratos cuantas veces se da un concepto.

Ocurre que según mi lógica yo hago:

EXEC SP(SELECT MAX(contador),concepto from contratos order by
concepto group by concepto)

pero me da error y me dice que como el select devuelve varios
registros (lo cual es lógico) no se puede ejecutar el SP.


Sé que es un problema de concepto y de pensamiento. Algo falla en mi
planteamiento.


Gracias



On Fri, 30 Jul 2004 18:59:43 -0600, Javier Loria wrote:

Hola:
Si Fernando me permite.
Debes cambiar un poco la forma de pensar y sacar la logica del
Procedimiento y exponerla.
Por ejemplo asumamos que la tabla que expusiste se la de pedidos,
asumamos que lo que quieres es rebajar los articulos de inventario.
Podria hacerse asi:
>>> UPDATE Inventario
SET SaldoInventario=SaldoInventario-Veces
FROM Inventario
JOIN (SELECT Cliente, Concepto, COUNT(*) AS Veces
FROM Pedidos) AS NumPedidos
ON Inventario.Concepto=NumPedidos.Concepto
=>>> Veras que en este caso la operacion matematica fue muy sencilla
pero podria ser muchismo mas compleja. Si nos cuentas mas del
proceso te ayudamos con gusto.
Saludos,


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.

joselitux escribio:
la tabla donde hago el "select distinct concepto" es así:

ID CLIENTE CONCEPTO
1 jose tuercas
2 raul tornillos
3 jose tornillos
4 raul tornillos
5 pedro tuercas


el procedimiento almacenado cuenta el número de veces
(count(concepto))
que se pidieron tornillos o tuercas y realiza una serie de
operaciones matemáticas para luego insertarlo en otra tabla
haciendo un UPDATE
según
son tornillos o tuercas.

Así que resumiendo:

Hago un select distinct concepto.
para cada concepto hago un select count(*)
para cada select count aplico el SP
el resultado del SP actualiza otra tabla donde cada registro es
"CONCEPTO".

Tengo ya el SP armado, el problema es que no puedo hacer:

"exec sp(select distinct concepto from tabla)"

eso es de manera muy esquemática mi problema




On Fri, 30 Jul 2004 09:48:20 -0600, Fernando España wrote:

podias darnos la estructura de la tabla e identificar la pk, un par
de datos y la ejecucion logica asi te armamos la sentencia



"joselitux" escribió en el mensaje
news:
hola

Tengo un procedimiento almacenado que debe ejecutarse para cada
registro de un campo de una tabla, pero no todos, sino solamente
tras un SELECT DISTINCT.

¿se puede hacer si cursores?
Hasta ahora todo lo que he intentado me dice que no se puede
ejecutar porque el select devuelve más de un resultado, cosa por
otra parte
lógica.
¿cómo puedo hacerlo?


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