Sulla Programmazione

Quattro chiacchere sulla programmazione e sulle bit-tecnologie con Fabrizio Cipriani

Pulizia delle query SQL in visual studio 2008 con le regular expressions

Vi siete mai messi a pulire le query SQL incorporate all'interno del codice c# per provarle nel query analyzer? Prendete ad esempio questa query:

1
2
3
4
5
6
SqlCommand cmd = new SqlCommand( 
  " SELECT products.prodid, products.prodname, " +
  " categories.catid, categories.catname " +
  " FROM Products " +
  " INNER JOIN Categories ON Products.catid = Categories.catid " +
  " WHERE categoryd = @catid ", cn);

Mi capita spesso di trovarmi di fronte a query del genere quando lavoro su codice scritto da altri (o addirittura su codice scritto da me stesso tanto tempo fa), quando per qualche motivo non è stato usato il prefisso "@" per creare una stringa verbatim string literal..

Fondamentalmente si tratta di rimuovere le virgolette all'inizio ed alla fine di ogni riga, incluso il carattere "+". Se le query sono lunghe e l'operazione deve essere ripetuta molte volte, può diventare noiosa, oltre che una discretta perdita di tempo. Così ho assemblato un paio di regular expressions e le ho applicate ai campi testo in questo post:

Query SQL da pulire:

Una volta cliccato il pulsante "Esegui pulizia" si ottiene la query senza virgolette, pronta da dare in pasto al Query Analyzer di Sql Server Management Studio (occore sostituire i parametri naturalmente).

Perchè il tool funzioni, la sequenza " + (virgolette più) deve chiudere la linea, ed il seguente segmento di query deve essere sulla linea successiva. Questo è il codice javascript che effettua la pulizia:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
function doClean()
{
  var str = document.getElementById('inregexp').value;
  // virgolette ad inizio linea
  str = str.replace(new RegExp(/\^\\s\*["]/gim), '');          
  // sequenza "virgolette più" a fine linea  
  str = str.replace(new RegExp(/["]\\s\*[+]\\s\*\$/gim), ''); 
  // virgolette alla fine dell'ultima linea 
  str = str.replace(new RegExp(/["]\\s\*\$/gim), '');

  document.getElementById('outregexp').value = str;
}

Comments