Principales respuestas
Update

Pregunta
-
Necesito hacer una actualizacion a un campo de una tabla que se llena con un sp donde ese campo lo inserto en cero en la tabla inicialmente, el update es:
Upadate tabla1
set campo1 = (select (tabla2.campo2*12) - ((funcion_conteo_datos_de_otra_tabla_de_otra_bd)*valor de tabla3 donde el campo tabla3.campo3 ='V')+
(funcion_conteo_datos_de_otra_tabla_de_otra_bd)*valor de tabla3 donde el campo tabla3.campo3 ='A')+
(funcion_conteo_datos_de_otra_tabla_de_otra_bd)*valor de tabla3 donde el campo tabla3.campo3 ='R'))
Agradezco su ayuda, lo necesito urgente. Gracias!
Respuestas
-
El problema (como mínimo) lo tienes en este from
FROM [BD1].tabla_aten, --tabla de otra BD
tabla_v,
PRUEBA1_TABLA
WHERE
tabla_v.tipo = tabla_aten.tipo
AND tabla_aten.campo1 = @campo1
AND tabla_aten.campo2 = @campo_cya que haces join de tabla_v con tabla_aten, y CROSS JOIN con Prueba1_tabl, es decir no la relacionas por lo que eso devolverá los registros que filtren tabla1 y tabla_aten( imaginemos que solo 1) multiplicados por el número de fila de prueba_1 tabla.. tabla que por cierto no usas.
Por otra parte si esa funcion solamente hace un select... sacalo de una udf y metelo como código normal que saldrás ganando.
Comparte lo que sepas, aprende lo que no sepas (FGG)
portalSQL
El rincón del DBA- Propuesto como respuesta Alberto López Grande (qwalgrande)Moderator sábado, 5 de mayo de 2012 6:14
- Marcado como respuesta Eder Costa miércoles, 9 de mayo de 2012 13:47
-
Todas las respuestas
-
es dificil darte una respuesta así.. lee este post y ayudanos a ayudarte.
Comparte lo que sepas, aprende lo que no sepas (FGG)
portalSQL
El rincón del DBA -
mmm dificil de entender y asi dificil de ayudar
-
-
Buen día,
Estoy realizando el siguiente sp:
USE [BD]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[PRUEBA1]
--EXEC PRUEBA1 'C'
--EXEC PRUEBA1 'B'
@FILTRO NVARCHAR(10)
AS
BEGIN
IF @FILTRO = 'C'
BEGIN
DELETE FROM PRUEBA1_TABLA WHERE FILTRO = 'C'
INSERT INTO PRUEBA1_TABLA
--INFORMACION
SELECT DISTINCT
TABLA1.CAMPO1,
0 as CAMPO2,0 as CAMPO3,
0 as CAMPO4,
0 as CAMPO5
FROM TABLA1(NOLOCK)
END
ELSE
IF @FILTRO = 'B'
BEGIN
DELETE FROM PRUEBA1_TABLA WHERE FILTRO = 'B'
INSERT INTO PRUEBA1_TABLA
--INFORMACION 1
SELECT TABLA1.CAMPO1,
0 as CAMPO2,0 as CAMPO3,
0 as CAMPO4,
0 as CAMPO5
FROM TABLA1(NOLOCK)
WHERE TABLA1.CAMPO3=1
--INFORMACION 2
UNION
SELECT TABLA1.CAMPO1,
0 as CAMPO2,0 as CAMPO3,
0 as CAMPO4,
0 as CAMPO5
FROM TABLA1(NOLOCK)
WHERE TABLA1.CAMPO3=2
ENDUPDATE PRUEBA1_TABLA
SET CAMPO3 = DBO.[FUNCION_C](CAMPO1,'V')
FROM PRUEBA1_TABLA
WHERE FILTRO = @FILTRO
UPDATE PRUEBA1_TABLA
SET CAMPO4 = DBO.[FUNCION_C](CAMPO1,'A')
FROM PRUEBA1_TABLA
WHERE FILTRO = @FILTRO
UPDATE PRUEBA1_TABLA
SET CAMPO5 = DBO.[FUNCION_C](CAMPO1,'R')
FROM PRUEBA1_TABLA
WHERE FILTRO = @FILTRO
ENDEjecutandolo asi:
--EXEC PRUEBA1 'C' se demora 46 minutos para 88416 registros
--EXEC PRUEBA1 'B' se demora 25 segundos para 65 registrosLa funcion que utilizo es la siguiente:
USE [BD]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[FUNCION_C] (@campo1 INT, @campo_c CHAR(15))
RETURNS INT
AS
BEGIN
DECLARE @NUM
BEGIN
SET @NUM=0
SELECT @NUM =COUNT(ID)
FROM [BD1].TABLA_ATEN -- TABLA DE OTRA BD
WHERE TABLA_ATEN.campo1 = @campo1
AND TABLA_ATEN.campo_c=@campo_c
END
RETURN @NUM
END
GO
-
Ahora, necesito actualizar el campo2 de la tabla PRUEBA1_TABLA alimentada en el sp PRUEBA1:
UPDATE PRUEBA1_TABLA
SET campo2 =(SELECT (tabla_cc.val*12)-(DBO.[funcion_r] (PRUEBA1_TABLA.campo1, 'V')
+ DBO.[funcion_r] (PRUEBA1_TABLA.campo1, 'A')+ DBO.[funcion_r] (PRUEBA1_TABLA.campo1, 'R')))
FROM tablacc, PRUEBA1_TABLA
WHERE tablacc.campo1 = PRUEBA1_TABLA.campo1
-
y esta es la última función que utilizo:
USE [BD]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[funcion_r] (@campo1 INT, @campo_c CHAR(15))
RETURNS INT
AS
BEGIN
DECLARE @VALOR decimal(28,2)
BEGIN
SET @VALOR=0
SELECT @VALOR =(select DBO.[funcion_c](@campo1,@campo_c)*tabla_v.VALOR)
FROM [BD1].tabla_aten, --tabla de otra BD
tabla_v,
PRUEBA1_TABLA
WHERE
tabla_v.tipo = tabla_aten.tipo
AND tabla_aten.campo1 = @campo1
AND tabla_aten.campo2 = @campo_c
END
RETURN @VALOR
END
GOPero dura ejecutando mas de una hora el solo update que escribi en el mensaje anterior y me toca detenerlo ... Agradezco la ayuda, es urgente
-
Hola. Gracias por los mensajes adicionales, pero no es claro que quieres hacer... Reducir el tiempo de ejecución? Detener el UPDATE? Buscar otra manera de escribir el procedimiento almacenado? Y lo otro, para un número de registros, dice que se tarda 46 minutos y ahora dices que lleva una hora y que necesita detenerlo... De nuevo, es confuso.
Gracias de nuevo y saludos,
Guillermo Taylor F.
IT Pro & Xbox gamer
My blog -
Lo unico que necesito es hacer el siguiente update:
UPDATE PRUEBA1_TABLA
SET campo2 =(SELECT (tabla_cc.val*12)-(DBO.[funcion_r] (PRUEBA1_TABLA.campo1, 'V')
+ DBO.[funcion_r] (PRUEBA1_TABLA.campo1, 'A')+ DBO.[funcion_r] (PRUEBA1_TABLA.campo1, 'R')))
FROM tablacc, PRUEBA1_TABLA
WHERE tablacc.campo1 = PRUEBA1_TABLA.campo1Reduciendo el tiempo de ejecucion, si es necesario buscar otra manera de escribir este update.
Tarda 46 minutos ejecutando el procedimiento --EXEC PRUEBA1 'C' se demora 46 minutos para 88416 registros (que no tiene que ver con lo que necesito.)
Lo que dura mas de una hora es el update que acabo de pegar aca, y nunca termina.
Gracias!
-
El problema (como mínimo) lo tienes en este from
FROM [BD1].tabla_aten, --tabla de otra BD
tabla_v,
PRUEBA1_TABLA
WHERE
tabla_v.tipo = tabla_aten.tipo
AND tabla_aten.campo1 = @campo1
AND tabla_aten.campo2 = @campo_cya que haces join de tabla_v con tabla_aten, y CROSS JOIN con Prueba1_tabl, es decir no la relacionas por lo que eso devolverá los registros que filtren tabla1 y tabla_aten( imaginemos que solo 1) multiplicados por el número de fila de prueba_1 tabla.. tabla que por cierto no usas.
Por otra parte si esa funcion solamente hace un select... sacalo de una udf y metelo como código normal que saldrás ganando.
Comparte lo que sepas, aprende lo que no sepas (FGG)
portalSQL
El rincón del DBA- Propuesto como respuesta Alberto López Grande (qwalgrande)Moderator sábado, 5 de mayo de 2012 6:14
- Marcado como respuesta Eder Costa miércoles, 9 de mayo de 2012 13:47
-
Hola.
¿Resolviste el problema?
Alberto López Grande
SQL Server MVP
Visita mi blog en http://qwalgrande.com
Sígueme en twitter en http://twitter.com/qwalgrande -