Hero

Como usar CTE para actualizaciones masivas en MS SQL Server

Marzo 29, 2013

enzo
Microsoft
SQL-Server

En alguna ocasiones necesitamos realizar demostraciones de algunos de nuestros productos, lo cual requiere que no mostremos datos reales de alguno de nuestros clientes, por lo tanto es necesario manipular las base de datos para ofuscar los datos como por ejemplo cambiar los nombres de los clientes o de los productos.

Imaginemos una tabla de productos la cual tiene más de 15 mil productos y deseamos cambiar los nombres a que se llamen “Producto # 1”, “Producto # 2” y así sucesivamente.

Para cumplir este objetivo haremos uso de los CTE (Common Table Expressions) para crear un conjunto de datos temporales sobre los cuales realizar alguna operación de SELECT, INSERT, UPDATE, DELETE o para VIEWS.

En el siguiente ejemplo se asume una tabla llamada Clientes con una columna llamada Codigo y sobre esta columna se calcular el ID numero para asignar un nombre dinámico a cada cliente para nuestra demostración, como se puede apreciar a continuación.

<pre title="CTE para Update">WITH C AS
(
SELECT *,
 ROW_NUMBER() OVER (ORDER BY Codigo ASC) AS ID
FROM Clientes 
)
UPDATE C 
SET Descripcion = 'Cliente # ' + CAST(ID as varchar(5))

La función ROW_NUMBER disponibles a partir de la versión 2005 de SQL Server, retorna un número secuencial para cada fila de un conjunto de resultados, pero solo puedes ser usando en sentencias SELECT por que no se puede usar en un UPDATE, afortunadamente al hacer uso de las CTE podemos usarlo para definir un columna temporal llamada ID que sera usada dentro del UPDATE.

En el ejemplo hacemos uso del operador ’+’ , pero los usuarios que cuentes con SQL SERVER 2012 pueden usar la función CONCAT y para finalizar hacemos uso de la función CAST para evitar que la concatenación falle.

Podemos repetir este proceso para todas las tablas que contengan datos que deseemos ofuscar y así no comprometer los datos de nuestros clientes.

Espero que les haya sido de ayuda.

enzo

Recibe consejos y oportunidades de trabajo 100% remotas y en dólares de weKnow Inc.