FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Saber si el dato de un campo ha cambiado en SQL SERVER
Necesito si alguien me puede decir como hacer para verificar en SQL SERVER si el dato de un campo ha cambiado (pueden ser mas de un campo)
Tomando como base la consulta que puse necesito saber si alguno de esos campos que se van a insertar ha cambiado en la tabla donde los tengo que insertar. Esto es para que cada vez que mando a insertar el registro con el SP no lo inserte a menos que halla cambiado alguno de los campos. Alcaro que el campo clave no es nunguno de los que esta en la consulta y que el registro se busca por sucursal. Los registros sin procesar solo podrán tener uno solo, mientras que los procesados puede que allan varios. Además no se puede hacer UPDATE porque se tienen que mantener por un tiempo X los registros procesados Saludos, El Rayo
__________________
Si tienes una función o procedimiento con diez parámetros, probablemente hayas olvidado uno Última edición por elrayo76 fecha: 12-02-2016 a las 20:44:56. |
#2
|
||||
|
||||
La manera mas sana es tener un campo timestamp/version que se actualiza al hacer cambios por registro y se compara con el ultimo valor...
Hacerlo *por campo* me parece erroneo. El modelo relacional es muy claro: El valor de una relacion es completo (osea: Lo que llamamos "registro" o fila). Si esta en una relacion, los cambios son a esa relacion, no a un pedacito de ella...
__________________
El malabarista. |
#3
|
|||
|
|||
El tema es que donde tengo que insertar los datos no es relación de ninguna otra tabla. Lo de la fecha no sirve.
Explico algo para que se entienda mejor. Si en la tabla temporal existe un registro que tiene el estado de no procesado y por algun motivo se manda nuevamente ese mismo registro, tendría que poder saber si alguno de los campos del registro nuevo es distinto al del que existe en la temporal. De esta forma anularía (pasaría a procesado) el que ya existe y dejaria el que esta viniendo nuevo que todavía no se inserto. Pense en su momento hacerlo con un UPDATE, pero no sirve, ya que si piso el registro se mandaría a procesar nuevamente un registro que no correspondería si en el mismo no cambio nada. Saludos, El Rayo
__________________
Si tienes una función o procedimiento con diez parámetros, probablemente hayas olvidado uno |
#4
|
||||
|
||||
No te entiendo... como no puede ser una relacion si estas insertando en una tabla y ademas chequeas contra la misma?
Ahora, si entiendo lo que buscas estas armando un "Task Queue". Podrias explicar la logica (sin SQL, pseudocodigo) del proceso completo?
__________________
El malabarista. |
#5
|
|||
|
|||
No creo que pueda con pseudocodigo es algo complejo y en este momento no lo tengo a mano.
Lo que quiero es lo siguiente: 1) Leer con SQL datos que salen de distintas tablas. 1) Validar esos datos contra la tabla donde se van a insertar para ver que el registro no existe. Si existe ver que no tenga campos con datos distintos 2) Solo insertar si no existe el registro o alguno de los campos tiene datos distintos. Nada mas que eso es lo que quiero hacer. El tema es que no se como validar cada uno de los campos para poder hacerlo de una forma facil y no uno por uno recorriendo la tabla. No se si se puede hacer lo que quiero. Saludos, El Rayo
__________________
Si tienes una función o procedimiento con diez parámetros, probablemente hayas olvidado uno |
#6
|
||||
|
||||
El asunto es que esto no tiene muchas formas de hacerse, y al final es lo mismo.
La forma mas simple es usando un o mucho mas correcto, un MERGE/UPSERT El asunto es que la logica se complica por el problema de chequear por campo. La manera mecanica es construir el WHERE comparando campo por campo, pero hacer un DIFF entre lo viejo y lo nuevo es una vuelta mas complicada. Es MUCHO mas simple si aceptas usar un timestamp/version. La comparacion es solo contra el timestamp y eliminas /re-insertar la fila entera (eso lo hace el UPSERT). ---- Cita:
Porque si lo que quieres es poder mandar un "trabajo" que debe tomar N-Clientes, y asegurarse de que ese trabajo sea idempotente y que solo se procese una sola vez, es un rollo muy diferente. Se puede con Sql, pero tienes que hacerlo BIEN: http://rusanu.com/2010/03/26/using-tables-as-queues/
__________________
El malabarista. |
#7
|
|||
|
|||
Gracias gente, con el MERGE pude resolver lo que necestaba sin problemas.
Saludos, El Rayo
__________________
Si tienes una función o procedimiento con diez parámetros, probablemente hayas olvidado uno |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Saber cuando el foco a cambiado de celda en un StringGrid | fredycc | Varios | 1 | 12-01-2009 22:05:03 |
Saber si ha cambiado una página web | javiermorales | Internet | 4 | 17-09-2008 08:46:17 |
Convertir Campo en SQL SERVER a otro tipo de dato | subzero | MS SQL Server | 1 | 29-06-2007 02:07:54 |
Saber si un dato existe en una query | ilichhernandez | Conexión con bases de datos | 9 | 03-11-2005 06:10:31 |
Saber cuantas veces se repite un dato en una tabla | Tangela | SQL | 2 | 18-08-2005 06:31:13 |
|