2011-11-26 15 views
5

Tengo dos tablas, Table_A y Table_B. Table_A tiene una relación de uno a muchos con Table_B.¿Cómo puedo escribir un activador de actualización para actualizar la tabla actual en función de un valor en otra tabla en SQL Server 2008?

Después de insertar un registro en la tabla secundaria (Table_B) Quiero usar un disparador para obtener un valor de un campo en la tabla padre (Table_A) y actualizar el registro actualmente insertado en Table_B.

TABLE_A

PK|EmpID|MemID|Firstname|Lastname 
---------------------------------- 
1 |1234 |AB123|John  | Doe 
2 |5678 |CD456|Jane  | Smith 

Table_B

PK|EmpID|MemID|Description 
--------------------- 
1 |1234 |NULL |Finance 
2 |1234 |NULL |IT 
3 |5678 |NULL |Finance 
4 |5678 |NULL |Management 

El disparador debe agarrar el valor MemID de TABLE_A y actualizar su valor correspondiente en Table_B donde [TABLE_A]. [EmpID] = [ Table_B]. [EmpID]. Por supuesto, después de 4 insertos en Table_B los resultados deberían ser los siguientes:

PK|EmpID|MemID|Description 
--------------------- 
1 |1234 |AB123|Finance 
2 |1234 |AB123|IT 
3 |5678 |CD456|Finance 
4 |5678 |CD456|Management 

ampliamente que han buscado otros sitios técnicos, pero parece que no puede encontrar uno con este escenario particular. Como un movimiento desesperado me he registrado en este sitio y esta sería mi primera publicación para obtener ayuda.

El siguiente es mi inútil intento de intentar crear mi primer activador en MS SQL Server 2008 R2.

CREATE TRIGGER dbo.trgInsMemID 
ON dbo.Table_B 
AFTER INSERT 
AS 
    BEGIN 
     UPDATE dbo.Table_B 
      SET MemID = 
       (SELECT MemID 
       FROM inserted i 
       JOIN dbo.Table_A c ON c.EmpID = i.EmpID) 
      FROM dbo.Table_B b 
      JOIN inserted i ON i.MemID = b.MemID 
    END 
+2

Bienvenido a StackOverflow. Gracias por publicar estructuras de tablas, datos, resultados esperados y su intento hasta el momento. Muestra esfuerzo y hace que la comunidad lo ayude mucho más fácilmente. +1 –

Respuesta

3

creo que usted quiere que su instrucción de actualización cambiado a tener este aspecto:

UPDATE b 
SET b.MemId = a.MemId 
FROM dbo.Table_B AS b 
INNER JOIN Inserted AS i ON b.EmpId = i.EmpId 
INNER JOIN dbo.Table_A AS a ON b.EmpId = a.EmpId 

Esto actualizará sólo los registros en B, que también estaban en la mesa insterted. (Primera INNER JOIN)

A continuación, INNER JOIN en Table_A en EmpId para tirar el correcto MemId para actualizar sus registros con.

+0

Gracias por la ayuda y sí, funcionó perfectamente cuando inserté 100 registros, y como se esperaba de un desencadenador, tomó unos segundos. En realidad, estoy cargando un archivo de texto a través de un programa C# (implementando el paralelismo) que usa LINQ to SQL para escribir en DB y cuando cargué 2 archivos, el desencadenador no estaba sincronizado. Pero basta con decir que, de hecho, has respondido mi pregunta perfectamente según mi publicación. Tendré que jugar con los disparadores un poco más, ahora que ha corregido mi sintaxis. Gracias. – Django

+0

@Django Otra opción, si MemId no tiene que actualizarse inmediatamente, es ejecutar la actualización una vez que ambos archivos hayan sido cargados en la base de datos. Si elimina la línea 'INNER JOIN inserted', podrá actualizar todos los registros Table_B que coincidan con Table_A en EmpId con MemId desde Table_A. También puede consultar las transacciones para eliminar problemas con la sincronización, pero aumentará el bloqueo. –

+0

Perdón por la respuesta tardía. Aprecio tu ayuda para brindar otra opción. He probado ambos y prefiero el primero. Gracias otra vez. – Django

Cuestiones relacionadas