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?
Deja tu comentario