En esta ocasión os traigo un pequeño truco para SQL Server, que puede que le salve la vida a alguno, como me la salvó a mi en su momento.
El problema
Tenemos una tabla, de la que vamos a actualizar los registros en función de algunas columnas, pero no desde la columna de identificación, ID único. Necesitamos conocer el identificador de la columna o columnas actualizadas, para con ese identificador realizar luego otra actualización o sencillamente devolver al usuario todas las filas afectadas.
En mi caso, tennía que actualizar una tabla desde dos columnas y conocer el ID de la columna actualizada para asignarlo en el Modelo y devolverlo al usuario.
Conocer el ID de la tabla actualizada
Después de investigar un poco, la verdad que la solución es muy sencilla. Sólo tenemos que realizar un par de pasos.
- Declarar un objeto TABLE con una columna para almacener el resultado.
- Crear la consulta de actualización UPDATE con los SET que precisemos.
- Utilizar el método OUTPUT y la propiedad INSERTED para insertar en la el objeto TABLE el campo de ID deseado.
- Filtrar la consulta por los campos deseadon en la cláusula WHERE.
- Finalizar con un SELECT del objeto TABLE para obtener el ID del registro modificado.
Como quedará más claro es con un ejemplo, aqui os dejo una consulta para ello.
DECALRE @mytable AS TABLE
(
Id INT
)
UPDATE Table SET Name='DrUalcman'
OUTPUT INSERTED.Id INTO @mytable
WHERE LastName='Programación'
SELECT Id FROM @mytable
Algo interesante
Mientras escribía este blog me he dado cuenta de algo muy interesante. Normalmente utilizamos la propiedad INSERTED en un TRIGGER después de una agregar o actulizar filas en una tabla. Pero teniendo en cuenta este truco, podríamo utilizar la función OUTPUT INSERTED para registrar, por ejemplo, en una tabla real de la base de datos, que tabla, y datos se están modificando a modo the LOG.
No lo he probado, pero imagino que en inserted podremos llamar todas las columnas que deseemos, y por lo tanto el OUTPUT podrá insertar tantas columnas como deseemos en la tabla, por lo que la taba, ya sea como objeto, temporal o real, podrá recibir todos los datos que deemos respetanto el órden y tipo de dato a insertar.
Conclusiones
Bueno, hoy mi ordenador me la ha judado un par de veces y es la tercera vez que escribo este blog. Leer el enlace con la información de dónde he sacado este pequeño truco, ya que hay otra manera, aparentemente más sencilla. Lo único que haciendolo de ésta manera, si se actualizan más de un registro obtines todos los ID de los registros modificados, de la otra manera hay que estar seguro de que sólo vas a actualizar un único registro, para obtener el ID correcto. Yo en mi caso, necesitaba saber cuántos registros se actualizaban y todos sus ID por lo que este truco me vino de perlas.
Happy Codding