Hablamos de como concatenar múltiples resultados en una cadena de caracteres usando  FOR XML PATH y además de la cláusula  EXISTS . Aquí les traemos un examen práctico  que los incorpora.

En uno de nuestros proyectos, tenemos una base de datos archivada que contiene el historial de algunas sentencias Selects a tablas en la base de datos de producción. Ya que en la base de datos archivada puede haber múltiples entradas del mismo registro de diversas ocasiones cuando se corrieron estos Selects, necesitamos mantener la fecha y hora (date stamp) hay que tener en cuenta que las tablas de historial tienen sus propias claves primarias. A la base de datos archivada se le importa la data a una hora en específico. En el último paso del proceso de importación, debemos asegurarnos  que todas las nuevas entradas a la base de datos archivada tengan la misma fecha y hora, en nuestro caso usamos el campo llamado HistDate. Este guarda la fecha de cuando el registro fue archivado.

La manera difícil

Puede crear a procedimiento almacenado con una sentencia de actualización T-SQL para cada una de las tablas que actualizarán el campo HistDate en cada tabla. El inconveniente  para este método es que hay  que darle mantenimiento, siempre que se agregue una nueva tabla con el campo en cuestión.

Ahora la manera fácil

Para hacerlo, tenemos que usar SQL dinámico. Pero no queremos tener errores debido a que haya tablas que no tengan el campo HistDate –no todas las tablas en la base de datos archivada necesariamente tienen esta columna. Por lo tanto, para construir una sentencia de actualizar solo las tablas que si lo tengan, se necesita buscar en sys.columns y determinar si la tabla contiene o no una columna con dicho nombre.

Aquí está el T-SQL:
DECLARE @parms nvarchar(MAX) = '@HistDate datetime',
@sql nvarchar(MAX) = (
SELECT
'UPDATE dbo.' + QUOTENAME(o.name) + ' SET HistDate = @HistDate WHERE HistDate IS NULL;'
FROM sys.objects AS o
WHERE o.type = 'U'
AND o.schema_id = SCHEMA_ID('dbo')
AND EXISTS (
SELECT NULL
FROM sys.columns AS c
WHERE c.object_id = o.object_id
AND c.name = 'HistDate'
)
FOR XML PATH('')
);
EXEC sys.sp_executesql @sql, @parms, @HistDate;

Note el uso de parámetros: los cual es de mucha ayuda al momento de manejar las variables de entradas como es el caso de @HistDate y protegiéndonos de una inyección de SQL.

Para usar el código, simplemente cree un procedimiento almacenado que acepte el parámetro HistDate y agregue otra línea en su trabajo archivado. Otra alternativa es que nos contrate y nosotros le daremos una gran solución para dicho archivado. Contáctenos  aquí.

¿A qué otras solución ingeniosa ha llegado usted?