Supongamos que tengo una tabla con un campo de identidad. Quiero insertar un registro si aún no existe. En el siguiente ejemplo, verifico si el valor almacenado en @ Field1 ya existe en la tabla. Si no, insertar un nuevo registro:¿Cómo se obtiene el valor de identidad después de usar MERGE cuando hay una coincidencia?
Definición de la tabla:
MyTable (MyTableId int Identity not null, Field1 int not null, Field2 int not null)
Así es como puedo comprobar si el valor ya existe y la inserto en caso necesario
merge MyTable as t
using (@Field1, @Field2) as s (Field1,Field2)
on (t.Field1=s.Field1)
when not matched then
insert (Field1,Field2) values (s.Field1,s.Field2);
Conseguir la identidad el valor cuando el registro no existía en la tabla se puede hacer al agregar:
output Inserted.MyTableId
pero ¿y si el registro ya estaba en la mesa (es decir, si había una coincidencia)?
La única manera que he encontrado es para consultar la tabla después de ejecutar la instrucción MERGE:
select MyTableId from MyTable where [email protected]
¿Hay una manera de obtener el valor de identidad directamente de la fusión?
Gracias Adrian, pero si no hay coincidencia, ¿cómo se obtiene el nuevo valor de identidad en @MatchedId? – Anthony
Gracias por la actualización. Sí, esto funcionaría, pero parece que es mucho más código que simplemente hacer "seleccionar MyTableId desde MyTable donde Field1 = @ Field1" después de la combinación (obviamente depende del tamaño de la tabla real, etc.).Solo esperaba que hubiera una solución 'incorporada' en la declaración Merge que devolvería el valor de identidad en ambos casos (igual o no coincide). – Anthony