Com actualitzar massivament els valors d’un camp de diferents taules
Publicat el : 25-01-2010 | Per : Roger | Dins : Dia a Dia, Informàtica, Internet, Programació
0

Una de les intencions que tenia amb el meu blog, és parlar també de tecnologia, però no només aquella que es relaciona amb l’oci, sinó també amb els problemes que hem trobo dia a dia a la feina. La setmana passada hem va tocar fer un script de SQL per revisar i canviar el format d’un camp. Això hem va permetre trobar una solució molt interessant.
Com sempre, quan un no és expert en una matèria el millor que pot fer és recòrrer a la xarxa per veure si algú ja ha solucionat el problema que vols resoldre. A mi m’ha tocat fer que tots els camps de totes les taules de la BBDD que continguin una matrícula només poden tenir números i lletres sense cap caracter especial.
El primer problema, quan tens una BBDD amb més de 100 taules és trobar les diferents taules que tenen un camp amb la matrícula. La solució és la següent:
SELECT name FROM sysobjects WHERE id IN ( SELECT id FROM syscolumns WHERE name like '%matricula%')
En aquesta sentència podem observar el següent:
- sysobjects: Taula interna del SQL Server que conté totes les definicions d’objectes de les nostres BBDD.
- syscolumns: Taula interna del SQL Server que conté totes les definicions de les columnes de tots els objectes de les nostres BBDD.
Amb aquesta sentència (query), estem buscant totes les columnes que continguin la paraula ‘matricula’ al seu nom. Per tant, hem suposat que qualsevol persona que hagi creat un camp per emmagatzemar la matrícula, com a mínim part del nom del camp inclourà el text: ‘matricula’. És per això que és molt important que a l’hora de treballar en equip, tothom segueixi una mateixa nomenclatura a l’hora de posar noms a camps de la BBDD.
Un cop fet això, arriba el més complicat. Hem d’actualitzar tots els camps ‘matricula’ a les taules on hi apareix, fent que només continguin lletres i números. Per fer-ho, he utilitzant el següent codi:
select * from NOMTAULA while @@rowcount > 0
- update NOMTAULA
- set NOMCAMP = replace(NOMCAMP, substring(s, patindex(‘%[^a-zA-Z0-9 ]%’, NOMCAMP), 1), ”)
- where patindex(‘%[^a-zA-Z0-9 ]%’, NOMCAMP) <> 0
select * from NOMTAULA
Si analitzem aquest codi veurem el següent:
- Primer de tot seleccionem totes les dades d’una taula.
- Iniciem un bucle sempre i quant el número de registres que ens hagi retornat la sentència anterior sigui superior a 0 (existeixin regsitres)
- Executem la sentència d’actualització. (informeu-vos sobre les comandes replace, substring, patindex i les expressions regulars. Aquestes últimes són les que realment donen potència a la sentència)
Amb tot plegat, un problema diari resolt i la meva primera entrada que parla de programació informàtica.




