2011-05-16 15 views
9

Estoy tratando de usar la instrucción MERGE para lograr lo siguiente. Tengo un SP y le paso el parámetro TableValue. Así es como mi SP se ve así:SQL Server 2008 - instrucción MERGE - Realizar varias acciones en el bloque CUANDO SE COINCIDE

CREATE PROC sp_AddInformation 
@IntoTbl dbo.Information READONLY , 
@baseEventType dbo.EventType READONLY 

AS 

BEGIN 

MERGE Information 
USING (SELECT InfoID, NewsID, NewsType FROM @IntoTbl) AS baseInfo (InfoID, NewsID, NewsType) 
ON (info.infoID = baseInfo.InfoID) 
WHEN MATCHED 
     THEN 
     --EXEC dbo.sp_insertEventInfo(@baseEventType) (This is not working) 

     UPDATE set Info.Reporter = baseInfo.Reporter 
WHEN NOT MATCHED BY SOURCE 
     THEN 

     DELETE 
WHEN NOT MATCHED BY TARGET 
    THEN INSERT VALUES (InfoID, NewsID,NewsType); 
END 

¿Alguien sabe cómo puedo llamar a otro SP o realizar otra MERGE en otras mesas cuando coinciden en bloque?

Respuesta

9

No es posible llamar a un procedimiento almacenado o fusionar desde el bloque when matched. Solo puede actualizar o eliminar (o ambos). De la documentación en merge.

<merge_matched>::= 
    { UPDATE SET <set_clause> | DELETE } 

Puede utilizar la cláusula output para capturar las filas que se actualizó en when matched. El resultado se puede capturar en una variable de tabla que luego puede usar en otra declaración de combinación o en un procedimiento almacenado. Use inserted.* y $action en la salida. Las filas de when matched es donde $action = 'UPDATE'

1

La sintaxis muestra que ACTUALIZACIÓN eliminar o crear son las únicas opciones para merge_matched

como se muestra here

+0

¿Puedo usar otra instrucción Merge en When Matched o When Not Matched? – Asdfg

Cuestiones relacionadas