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

#1 Fernando España
30/07/2004 - 17:48 | Informe spam
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
Respuesta Responder a este mensaje
#2 joselitux
30/07/2004 - 18:32 | Informe spam
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
Respuesta Responder a este mensaje
#3 Javier Loria
31/07/2004 - 02:59 | Informe spam
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
Respuesta Responder a este mensaje
#4 joselitux
01/08/2004 - 12:33 | Informe spam
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
Respuesta Responder a este mensaje
#5 Javier Loria
03/08/2004 - 02:13 | Informe spam
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
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida