Consultas dinámicas
Consultas dinámicas SQL
En esta oportunidad vamos a ver que son las consultas dinámicas, para que sirven y como se usan.
¿Primeramente, por que usar una consulta dinámica?
if(@tipo_filtro = 'C')
set @where = 'where Cliente_id = ''' + @parametro1 + ''''
else
set @where = 'where Iva = ''' + @parametro1 + ''''
-- ########################################
-- Aquí la ejecuto
exec(@query)
¿Primeramente, por que usar una consulta dinámica?
Muchas veces nos encontramos con problemas los cuales requieren que sucedan cosas que una consulta normal de SQL pueda resolver, por ejemplo imaginemos que tenemos un SELECT donde se requiera que el condicional WERE sea de una forma o de otra dependiendo de un parámetro o un cálculo, veamos el siguiente ejemplo:
1.- Supongamos el siguiente esquema
2.- Con la siguiente información
3.- Ahora queremos hacer una consulta a la tabla facturas que dependiendo de una condición filtre por cliente o filtre por iva dependiendo de un parámetro asignado
use MiBd
--Parámetros necesarios, declaración de variables
declare
@tipo_filtro varchar(1),
@parametro1 varchar(20),
@where varchar(255),
@query varchar(max)
--Parámetros necesarios, declaración de variables
declare
@tipo_filtro varchar(1),
@parametro1 varchar(20),
@where varchar(255),
@query varchar(max)
-- #######################################
-- ####Asigno valor a los parámetros ####
-- #######################################
set @tipo_filtro = 'C' --Parámetro que puede cambiar a 'C' o otro
set @parametro1 = '001' --Parámetro que puede ser iva ejemplo 12 o código de cliente ejemplo: '001', '002'
-- ####Asigno valor a los parámetros ####
-- #######################################
set @tipo_filtro = 'C' --Parámetro que puede cambiar a 'C' o otro
set @parametro1 = '001' --Parámetro que puede ser iva ejemplo 12 o código de cliente ejemplo: '001', '002'
if(@tipo_filtro = 'C')
set @where = 'where Cliente_id = ''' + @parametro1 + ''''
else
set @where = 'where Iva = ''' + @parametro1 + ''''
-- ########################################
-- Creo la consulta dinamica
set @query = 'select * from Facturas f ' + @where
set @query = 'select * from Facturas f ' + @where
-- Aquí la ejecuto
exec(@query)
Aquí podemos analizar lo siguiente:
Se crea la consulta a través de un string, este string se arma de forma dinámica en el @where que depende del parámetro @tipo_filtro que puede ser 'C' que simboliza clientes u otra diferente como 'I' o cualquier otra letra que simboliza iva, también tomando en cuanta que si es 'C' hay que colocar en @parametro1 un valor que corresponda con un código valido de cliente, mientras que si es otro valor de @tipo_filtro hay que poner en @parametro1 un valor que corresponda a un iva valido.
Creo que es un ejemplo bastante sencillo, en verdad este tipo de consultas pueden llegar a ser extremadamente complejas por que provienen de un texto, un truco muy conocido es que si deseas evaluar como va quedando tu string puedes imprimirlo con 'print'.
Si te quedan dudas al respecto solo házmelo saber en los comentarios y con gusto te respondo.
Te invito a que hagas las preguntas que desees para crear más temas de SQL, muchas gracias.


Comentarios