miércoles, 28 de enero de 2009

Comilla or not Comilla

Buenas, 

Voy a exponer un caso de bricolaje constructivo en Transact SQL. Un compañero de la empresa necesitaba ejecutar una consulta pasándole el nombre de la tabla por una variable. Todos sabemos que eso es imposible, sin embargo hay una manera bastante común que es darle la vuelta a la consulta, meterla en una variable y luego ejecutarla en un exec:

Declare @Tabla as nvarchar (15)
Declare @Consulta as nvarchar(100)
Select @Consulta='Select * from '+@Tabla
Exec(@Consulta)

Los problemas empiezan cuando la consulta de mi amigo no cabe en un campo de texto normal y tampoco podemos recurrir a los campos binarios de Text, NText o Image porque no se pueden declarar variables de esta manera (No reservan espacios en memoria, generan pequeños archivos completos en local y almacenan punteros en memoria posteriormente). Este segundo escollo lo superamos incrustando el código directamente en el Exec:

Declare @Tabla as nvarchar (15)
Exec('Select * from '+@Tabla)

Pero desgraciadamente un tercer problema nos tuvo un pequeño rato entretenidos, necesitamos meter un where fijo sobre un campo de texto (la porra de las comillas ataca de nuevo), lo más fácil sería pensar en un +Char(39) + Peeero el problema es que el comando Exec no admite que le metamos esa funcioncita, dando un error de sintaxis. 
Pues bien, la solución es tan sencilla como absurda, se trata de timar al sistema haciendole creer que le vamos a pasar otra variable. Solo que esa variable contendrá nuestra ansiada comilla simple:

Declare @Tabla as nvarchar (15)
Declare @Comilla as char (1)
Select @Comilla=Char(39) 
Exec('Select * from '+@Tabla+' where [ID]='+@Comilla+'3'+@Comilla)

Con esto solucionamos el problema de la absurda restricción del comando EXEC

Un saludo.







No hay comentarios: