SQL Server - duda sobre scrip

 
Vista:

duda sobre scrip

Publicado por davis (33 intervenciones) el 22/10/2007 17:02:07
Hol foristas tengo el sgt problema

declare @c_1 varchar (50)
declare @c_2 varchar (50)

set @c_1 = null
set @c_2 = null

if ((@c_1 = @c_2) or (@c_1 is null and @c_2 is null ))
select 'igual'
else
select 'diferente'

/*PERO COMO HAGO SI ESTOS VALORES VIENEN DE TABLAS, NO SE COMO ENCAJAR
EL IF
PARA Q LA SCRIP FUNCIONE CORRECTAMENTE
ESTO LO USARE EN MI TRIGGER PARA COMPROBAR Q UNO DE ESTOS 3 CAMPOS REALMENTE CAMBIARON DESPUES DE UN UPDATE , LAS TABLAS SON INSERTED Y DELETED
*/

IF
((del.Codigo = ins.Codigo ) or (del.Codigo is null and ins.Codigo is null) ) AND
((del.Codmarca = ins.Codmarca ) or (del.Codmarca is null and ins.Codmarca is null) )
from Inserted ins ,deleted del

select 'igual'
ELSE
select 'diferente'

sus comentarios seran bienbenidos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:duda sobre scrip

Publicado por Isaias (3308 intervenciones) el 22/10/2007 20:20:54
Si lo que te interesa es saber si alguna columna fue actualizada, porque no utilizar, IF UPDATE ( column )
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:duda sobre scrip

Publicado por davis (33 intervenciones) el 22/10/2007 20:59:12
La idea es que cuando se q cuando se modifiquen cualquiera de estos codigos
(codigo ,codmarca , codpais )se inserte un registro en mi tabla Historico de Codigos

CREATE TRIGGER TR_1 /*Actualiza Historico de Articulos*/
ON Articulos
FOR UPDATE
AS
IF UPDATE (codigo) or UPDATE (codmarca) or UPDATE (codpais)
BEGIN
INSERT TCodigosA
select ins.codigo , del.codarticulo , del.codigo ,del.codmarca ,del.codpais ,
getdate () from Inserted ins ,deleted del
END

hasta ahi todo bien
pero si ejecuto este codigo :

update TArticulos
set codigo = '02364'
where codigo = '02364' //realmente no hay ningun cambio

me inserta un registro en historico
y la idea es q el trigger se ejecute solo cuando el nuevo dato a cargar es diferente
de lo contrario en la tabla historico tendria registros que estarian por la puras,
por eso quiero probar con las codiciones If (del.campo = ins.campo or )
(del.campo is null and ins.campo is null) Y Comprobar realmente si hubo algun cambio

Saludos ,espero haberme explicado mejor
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:duda sobre scrip

Publicado por Isaias (3308 intervenciones) el 23/10/2007 01:25:02
Te explicas perfectamente, mi duda es, ¿Que caso tendria ejecutar algo como lo que nos mandas?

update TArticulos
set codigo = '02364'
where codigo = '02364'
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:duda sobre scrip

Publicado por davis (33 intervenciones) el 23/10/2007 16:10:56
Veras trabajo con pb 9.0 y apara actualizar los codigos
En mi dw aparecen los campos

Codigo --CodMarca- Codpais
pongamos como ejemplo el sg codigo

Codigo --- CodMarca ---- Codpais
1020 --- 01 ----PER

si lo cambio por
5050 --- 01 ----PER

y luego regreso el mismo codigo
1020 --- 01 ----PER

al momento de grabar con el dw ,
dw_1.update ()
actualiza este articulo y se activa el trrigger q inserta el codigo anterior en una tabla historico de codigos , aunque realmente no cambie el codigo por q lo regrese a su valor anterior , pero el dw ya detecto q se hizo alguna cambio en sus celdas ,
ya se q podria hacer filtros para comparar en mi grilla q valores realmente se cambiaron y despues recien mandar el dw update o actualizar registro por registro , pero quiero q el trigger se encarge de esta tarea

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:duda sobre scrip

Publicado por Isaias (3308 intervenciones) el 23/10/2007 23:45:08
Esto tal vez deberia ir en el foro de programacion.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:duda sobre scrip

Publicado por davis (33 intervenciones) el 25/10/2007 00:30:37
Bueno ya encontre una solucion aunque el scrip del trigger es un poco mas extenso , cargo las valores de los campos inserted y deleted a variables
y luego comprar las variables para comprobar si realmente hubieron cambios
Saludos y gracias por tu tiempo

declare @v1_cod varchar (20)
declare @v2_cod varchar (20)
declare @v1_cm varchar (4)
declare @v2_cm varchar (4)
declare @v1_cp varchar (3)
declare @v2_cp varchar (3)
declare @vcomen varchar (500)

set @v1_cod = (select ins.codigo from inserted ins)
set @v2_cod = (select del.codigo from deleted del)
set @v1_cm = (select ins.codmarca from inserted ins)
set @v2_cm = (select del.codmarca from deleted del)

set @v1_cp = (select ins.codpais from inserted ins)
set @v2_cp = (select del.codpais from deleted del)
set @vcomen = ''

if ((@v1_cod = @v2_cod ) or (@v1_cod is null and @v2_cod is null )) and
((@v1_cm = @v2_cm ) or (@v1_cm is null and @v2_cm is null )) and
((@v1_cp = @v2_cp ) or (@v1_cp is null and @v2_cp is null ))
set @vcomen = 'nada' /*TODO SIGUE IGUAL*/

Else
BEGIN
begin
//inserta rsgistro en historico de codigos
end
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:duda sobre scrip

Publicado por Isaias (3308 intervenciones) el 25/10/2007 00:50:38
Davis

Solo una "pequeñisima" observacion.

Si tu haces un: DELETE tuTabla

Y esta tabla tiene 10, 000 registros por ejemplo, tendras 10, 000 registros en tu INSERTED y 10,000 en tu DELETED.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:duda sobre scrip

Publicado por davis (33 intervenciones) el 25/10/2007 16:07:40
Por eso lado no cre q haya mucho problema
ya que el trigger es For Update
salvo q haga una actualizacion masiva de codigos , ahi si cre que puedan haber problemas de lentitud al activarse el trigger ,

Saludos , y gracias por tus comentarios
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:duda sobre scrip

Publicado por Isaias (3308 intervenciones) el 26/10/2007 00:33:30
Davis

INSERTED / UPDATED, almacen los registros que se INSERTARON o bien se actualizaron.

Si tu trigger es FOR UPDATE y haces

UPDATE tuTabla SET tuCol = 10

Y actualiza 10,000 registros, tendras la misma cantidad en UPDATED.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:duda sobre scrip

Publicado por davis (33 intervenciones) el 27/10/2007 00:01:56
si las actualizaciones masivas , le van a dar "duro" al trigger ,
bueno voy a buscar la forma de acortar el scrip

= Saludos,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar