Modificación dinámica de tablas, usando Sysobjects y Syscolumns

Muchas veces tenemos una base de datos a la cual necesitamos modificarle datos, como updates a campos o largos de columnas. Esto no es un problema en sistemas de pequeño porte pero puede ser dificultoso cuando necesitamos rapidamente hacer esta tarea y no tenemos documentado o disponible la información necesaria.

Supongamos el caso donde tenemos una base con 200 o 300 tablas, y queremos hacer que aquellas que tengan un campo “Usuario” de value “Jonh” se modifiquen por “John”.

Ok, basicamente tenemos que mirar tabla por tabla, leer su definicion y ver si tienen una columna “Usuario” y si la tienen hacer un update a los campos “Usuario” de la tabla que contengan el valor “Jonh”.

Parece una tarea complicada (precisamente yo mismo me enfrenté a ese problema hoy), y mientras hacia la tarea manual de buscar las N tablas entre las 500 del sistema que tuvieran la columna que necesitaba, pense que habría una forma mas facil.

¿La solución?

select * from sysobjects where xtype='U'

Esa consulta nos trae todas las tablas del sistema, ahi podemos filtrar con un simple where si buscamos tablas con una syntaxis determinada, por ejemplo, en el caso de wordpress podemos usar algo como:

select * from sysobjects where xtype='U' and name like 'wp_%'

Esa consulta nos trae todas las tablas de wordpress.

¿Como seguimos?

Bueno, luego de esto debemos recorrer las columnas de cada tabla, y ver si tenemos una columna cuyo nombre sea “Usuario” para hacer el update.

select * from syscolumns where name = 'Usuario'

Listo, tenemos un query que nos trae la lista de columnas llamadas Usuario dentro del sistema, para saber a que tablas pertenecen, debemos simplemente hacer un join:

select B.name from syscolumns as A where A.name = 'Usuario'  
inner join sysobjects as B on A.id = B.id

Listo, tenemos la lista de tablas (sus nombres) que tienen una columna de nombre “Usuario”.

Con esto podemos ahora (no voy a explicar como) hacer un update dinámico recorriendo todas las tablas del sistema que tienen columnas de nombre “Usuario” y modificar el valor que queramos.

La forma mas facil es guardar los datos en una tabla temporal (el nombre de cada tabla) y recorrerla con un cursor haciendo el update.

Cursores lo explico mas adelante 🙂

Espero haya sido útil y sirva para facilitar este tipo de tareas encarandolas de forma inteligente.