ERROR EN SP...

10/10/2005 - 23:59 por Edmundo J. Davila | Informe spam
Hola amig@s:

Tengo el siguiente SP, probablemente no sea la forma mas optima de hacerlo,
pero creo que resuelve. Lo que hago es crear una tabla temporal donde pongo
uno datos que inmediatmente paso a la tabla INSS_DETALLE, luego borro de
INSS_TEMP, le pongo otros datos y los vuelvo a pasar a INSS_DETALLE. El
asunto los campos SAL-DEVENGADO, SAL-MENSUAL Y APORTE quedan con valores
NULL siempre.

Agradecería de parte de ustedes 2 cosas:

1. ¿como podria cambiar este SP para optimizar su ejecucion?
2. ¿que estoy haciendo mal que me deja los valores que quiero actualizar en
NULL?
3. ¿hay alguna forma de ver la ejecucion de un SP paso a paso?

De antemano muchas gracias por su ayuda.

EDU
CREATE PROCEDURE DBO.PA_PAGOINSS @pdPeriodo DateTime, @psSemana SmallInt,
@psNominaI VarChar(4), @psNominaF Varchar(4) AS

BEGIN TRANSACTION

DELETE FROM OCEXACTUS.DBO.INSS_DETALLE
IF @psSemana=4
INSERT INTO OCEXACTUS.DBO.INSS_DETALLE
SELECT EMPLEADO, ASEGURADO, NOMBRE_PILA, PRIMER_APELLIDO, NOMINA, '01',
@pdPeriodo, 0, 0, 0, '1111',CENTRO_COSTO, 'P'
FROM EXACTUS.MONISA.EMPLEADO
WHERE NOMINA BETWEEN @psNominaI AND @psNominaF AND ACTIVO='S'
ELSE
INSERT INTO OCEXACTUS.DBO.INSS_DETALLE
SELECT EMPLEADO, ASEGURADO, NOMBRE_PILA, PRIMER_APELLIDO, NOMINA, '01',
@pdPeriodo, 0, 0, 0, '11111',CENTRO_COSTO, 'P'
FROM EXACTUS.MONISA.EMPLEADO
WHERE NOMINA BETWEEN @psNominaI AND @psNominaF AND ACTIVO='S'

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'INSS_TEMP')
DROP TABLE INSS_TEMP

CREATE TABLE INSS_TEMP
(
EMPLEADO varchar(10),
MONTO float,
)

INSERT INTO OCEXACTUS.DBO.INSS_TEMP
SELECT EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO,
SUM(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.TOTAL) AS SALDEV
FROM EXACTUS.MONISA.EMPLEADO_CONC_NOMI INNER JOIN
EXACTUS.MONISA.NOMINA_HISTORICO ON EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA
= EXACTUS.MONISA.NOMINA_HISTORICO.NOMINA AND
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NUMERO_NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NUMERO_NOMINA
WHERE (EXACTUS.MONISA.NOMINA_HISTORICO.PERIODO = @pdPeriodo) AND
(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA BETWEEN @psNominaI AND @psNominaF)
AND (EXACTUS.MONISA.EMPLEADO_CONC_NOMI.CONCEPTO LIKE 'B%')
GROUP BY EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO

UPDATE OCEXACTUS.DBO.INSS_DETALLE
SET [SAL-DEVENGADO] (SELECT MONTO FROM OCEXACTUS.DBO.INSS_TEMP
WHERE OCEXACTUS.DBO.INSS_DETALLE.EMPLEADO=OCEXACTUS.DBO.INSS_TEMP.EMPLEADO)
FROM OCEXACTUS.DBO.INSS_DETALLE,OCEXACTUS.DBO.INSS_TEMP

DELETE FROM OCEXACTUS.DBO.INSS_TEMP

INSERT INTO OCEXACTUS.DBO.INSS_TEMP
SELECT EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO,
SUM(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.TOTAL) AS SALMEN
FROM EXACTUS.MONISA.EMPLEADO_CONC_NOMI INNER JOIN
EXACTUS.MONISA.NOMINA_HISTORICO ON EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA
= EXACTUS.MONISA.NOMINA_HISTORICO.NOMINA AND
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NUMERO_NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NUMERO_NOMINA
WHERE (EXACTUS.MONISA.NOMINA_HISTORICO.PERIODO = @pdPeriodo) AND
(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA BETWEEN @psNominaI AND @psNominaF)
AND (EXACTUS.MONISA.EMPLEADO_CONC_NOMI.CONCEPTO LIKE 'B%') AND (NOT
(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.CONCEPTO IN ('BG01', 'BQ04', 'BS04')))
GROUP BY EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO

UPDATE OCEXACTUS.DBO.INSS_DETALLE
SET [SAL-MENSUAL] (SELECT MONTO FROM OCEXACTUS.DBO.INSS_TEMP
WHERE OCEXACTUS.DBO.INSS_DETALLE.EMPLEADO=OCEXACTUS.DBO.INSS_TEMP.EMPLEADO)
FROM OCEXACTUS.DBO.INSS_DETALLE,OCEXACTUS.DBO.INSS_TEMP

DELETE FROM OCEXACTUS.DBO.INSS_TEMP

INSERT INTO OCEXACTUS.DBO.INSS_TEMP
SELECT EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO,
SUM(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.TOTAL) AS APORTE
FROM EXACTUS.MONISA.EMPLEADO_CONC_NOMI INNER JOIN
EXACTUS.MONISA.NOMINA_HISTORICO ON EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA
= EXACTUS.MONISA.NOMINA_HISTORICO.NOMINA AND
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NUMERO_NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NUMERO_NOMINA
WHERE (EXACTUS.MONISA.NOMINA_HISTORICO.PERIODO = @pdPeriodo) AND
(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA BETWEEN @psNominaI AND @psNominaF)
AND (EXACTUS.MONISA.EMPLEADO_CONC_NOMI.CONCEPTO IN
('DQ03','DQ10','DS03','DS10'))
GROUP BY EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO

UPDATE OCEXACTUS.DBO.INSS_DETALLE
SET APORTE (SELECT MONTO FROM OCEXACTUS.DBO.INSS_TEMP
WHERE OCEXACTUS.DBO.INSS_DETALLE.EMPLEADO=OCEXACTUS.DBO.INSS_TEMP.EMPLEADO)
FROM OCEXACTUS.DBO.INSS_DETALLE,OCEXACTUS.DBO.INSS_TEMP

COMMIT TRANSACTIONGO
 

Leer las respuestas

#1 Maxi \(MVP SQL\)
11/10/2005 - 02:51 | Informe spam
Hola, a ver, porque no hacer un solo insert a la tabla final? o sea si hacer
INSERT into tabla final SELECT no pasarias por la temporal.

Si lo que quieres es tener mas de un select dentro del mismo insert entonces
puedes usar UNION ALL.

A tu otra pregunta, esos campos quedan en null porque no tienen resultado,
si quieres que esten en otro valor distinto de null entonces usar
Isnull(campo,valor)


-
MS-MVP SQL SERVER
"Edmundo J. Davila" escribió en el mensaje
news:%
Hola :

Tengo el siguiente SP, probablemente no sea la forma mas optima de
hacerlo, pero creo que resuelve. Lo que hago es crear una tabla temporal
donde pongo uno datos que inmediatmente paso a la tabla INSS_DETALLE,
luego borro de INSS_TEMP, le pongo otros datos y los vuelvo a pasar a
INSS_DETALLE. El asunto los campos SAL-DEVENGADO, SAL-MENSUAL Y APORTE
quedan con valores NULL siempre.

Agradecería de parte de ustedes 2 cosas:

1. ¿como podria cambiar este SP para optimizar su ejecucion?
2. ¿que estoy haciendo mal que me deja los valores que quiero actualizar
en NULL?
3. ¿hay alguna forma de ver la ejecucion de un SP paso a paso?

De antemano muchas gracias por su ayuda.

EDU
> CREATE PROCEDURE DBO.PA_PAGOINSS @pdPeriodo DateTime, @psSemana SmallInt,
@psNominaI VarChar(4), @psNominaF Varchar(4) AS

BEGIN TRANSACTION

DELETE FROM OCEXACTUS.DBO.INSS_DETALLE
IF @psSemana=4
INSERT INTO OCEXACTUS.DBO.INSS_DETALLE
SELECT EMPLEADO, ASEGURADO, NOMBRE_PILA, PRIMER_APELLIDO, NOMINA, '01',
@pdPeriodo, 0, 0, 0, '1111',CENTRO_COSTO, 'P'
FROM EXACTUS.MONISA.EMPLEADO
WHERE NOMINA BETWEEN @psNominaI AND @psNominaF AND ACTIVO='S'
ELSE
INSERT INTO OCEXACTUS.DBO.INSS_DETALLE
SELECT EMPLEADO, ASEGURADO, NOMBRE_PILA, PRIMER_APELLIDO, NOMINA, '01',
@pdPeriodo, 0, 0, 0, '11111',CENTRO_COSTO, 'P'
FROM EXACTUS.MONISA.EMPLEADO
WHERE NOMINA BETWEEN @psNominaI AND @psNominaF AND ACTIVO='S'

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'INSS_TEMP')
DROP TABLE INSS_TEMP

CREATE TABLE INSS_TEMP
(
EMPLEADO varchar(10),
MONTO float,
)

INSERT INTO OCEXACTUS.DBO.INSS_TEMP
SELECT EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO,
SUM(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.TOTAL) AS SALDEV
FROM EXACTUS.MONISA.EMPLEADO_CONC_NOMI INNER JOIN
EXACTUS.MONISA.NOMINA_HISTORICO ON
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NOMINA AND
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NUMERO_NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NUMERO_NOMINA
WHERE (EXACTUS.MONISA.NOMINA_HISTORICO.PERIODO = @pdPeriodo) AND
(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA BETWEEN @psNominaI AND
@psNominaF) AND (EXACTUS.MONISA.EMPLEADO_CONC_NOMI.CONCEPTO LIKE 'B%')
GROUP BY EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO

UPDATE OCEXACTUS.DBO.INSS_DETALLE
SET [SAL-DEVENGADO]> (SELECT MONTO FROM OCEXACTUS.DBO.INSS_TEMP
WHERE
OCEXACTUS.DBO.INSS_DETALLE.EMPLEADO=OCEXACTUS.DBO.INSS_TEMP.EMPLEADO)
FROM OCEXACTUS.DBO.INSS_DETALLE,OCEXACTUS.DBO.INSS_TEMP

DELETE FROM OCEXACTUS.DBO.INSS_TEMP

INSERT INTO OCEXACTUS.DBO.INSS_TEMP
SELECT EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO,
SUM(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.TOTAL) AS SALMEN
FROM EXACTUS.MONISA.EMPLEADO_CONC_NOMI INNER JOIN
EXACTUS.MONISA.NOMINA_HISTORICO ON
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NOMINA AND
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NUMERO_NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NUMERO_NOMINA
WHERE (EXACTUS.MONISA.NOMINA_HISTORICO.PERIODO = @pdPeriodo) AND
(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA BETWEEN @psNominaI AND
@psNominaF) AND (EXACTUS.MONISA.EMPLEADO_CONC_NOMI.CONCEPTO LIKE 'B%') AND
(NOT (EXACTUS.MONISA.EMPLEADO_CONC_NOMI.CONCEPTO IN ('BG01', 'BQ04',
'BS04')))
GROUP BY EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO

UPDATE OCEXACTUS.DBO.INSS_DETALLE
SET [SAL-MENSUAL]> (SELECT MONTO FROM OCEXACTUS.DBO.INSS_TEMP
WHERE
OCEXACTUS.DBO.INSS_DETALLE.EMPLEADO=OCEXACTUS.DBO.INSS_TEMP.EMPLEADO)
FROM OCEXACTUS.DBO.INSS_DETALLE,OCEXACTUS.DBO.INSS_TEMP

DELETE FROM OCEXACTUS.DBO.INSS_TEMP

INSERT INTO OCEXACTUS.DBO.INSS_TEMP
SELECT EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO,
SUM(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.TOTAL) AS APORTE
FROM EXACTUS.MONISA.EMPLEADO_CONC_NOMI INNER JOIN
EXACTUS.MONISA.NOMINA_HISTORICO ON
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NOMINA AND
EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NUMERO_NOMINA =
EXACTUS.MONISA.NOMINA_HISTORICO.NUMERO_NOMINA
WHERE (EXACTUS.MONISA.NOMINA_HISTORICO.PERIODO = @pdPeriodo) AND
(EXACTUS.MONISA.EMPLEADO_CONC_NOMI.NOMINA BETWEEN @psNominaI AND
@psNominaF) AND (EXACTUS.MONISA.EMPLEADO_CONC_NOMI.CONCEPTO IN
('DQ03','DQ10','DS03','DS10'))
GROUP BY EXACTUS.MONISA.EMPLEADO_CONC_NOMI.EMPLEADO

UPDATE OCEXACTUS.DBO.INSS_DETALLE
SET APORTE> (SELECT MONTO FROM OCEXACTUS.DBO.INSS_TEMP
WHERE
OCEXACTUS.DBO.INSS_DETALLE.EMPLEADO=OCEXACTUS.DBO.INSS_TEMP.EMPLEADO)
FROM OCEXACTUS.DBO.INSS_DETALLE,OCEXACTUS.DBO.INSS_TEMP

COMMIT TRANSACTIONGO

Preguntas similares