viernes, octubre 21, 2011

SQL Server: una forma rapida de crear un IN dinamico

Esta es una situación que seguro les ha pasado muchas veces. Tienen un SP que recibe un parametro usado para filtrar sobre una tabla, digamos @status. Normalmente haríamos algo como esto:

SELECT * 
  FROM tabla
 WHERE (@status IS NULL OR status = @status)


Eso nos permitiria filtrar por un status especifico o no filtrar por status, indicando el valor NULL. Pero luego nos topamos con una situación en la que necesitamos filtrar por DOS valores de status distintos, digamos, registros ACTIVOS y ANULADOS. Obviamente nuestra primera intención es hacer:

SELECT * 
  FROM tabla
 WHERE (@status IS NULL OR status IN (@status))


lo cual no es una instrucción valida para SQL Server, sin importar lo logico que se vea. Normalmente la solución a esta situación pasa por la creación de una función que tome un VARCHAR con la lista de valores separados por coma y devuelva un TABLE con los valores ya separados, y luego usamos ese TABLE para hacer un FULL JOIN o un IN (SELECT).

Pero hoy encontre una solución bien sencilla, usando las desconocidas (al menos para mi) capacidades XML de SQL Server. La idea, basicamente, es usar la lista de valores para crear un XML y luego usar ese XML como una fuente datos en un IN (SELECT). Aplicando esto al ejemplo que mencionaba al principio, la cosa quedaria asi:

DECLARE @x XML
SET @x = '' + REPLACE( @status, ',', '') + ''

SELECT * 
  FROM tabla
 WHERE status IN (SELECT x.j.value('.', 'VARCHAR(max)') AS item FROM @x.nodes('//j') x(j))


Simple, cierto?

jueves, octubre 06, 2011

Buen viaje, Steve


Ayer inició su último viaje uno de mis heroes personales. Steve Jobs; su forma de encarar los desafios y su fuerte pasion por el diseño y la funcionalidad, han influenciado mi trabajo y mi forma de hacer las cosas desde que por primera vez tuve la oportunidad de ver de cerca una Macintosh original hace ya mas de 20 años.

El mundo no fué el mismo desde que Steve empezó a imprimir su particular forma de pensar y ver la computación, y definitivamente no será el mismo ahora que se ha ido.

Quiero terminar esta nota con una cita que recopiló mi esposa para mi:

Tres manzanas han cambiado el mundo: la que Eva le ofreció a Adan, la que despertó a Newton y la que sembró Steve Jobs