Query Dinamico

01/07/2004 - 22:20 por Isaias Islas | Informe spam
Hola amigos todos

He escuchado mas de una vez que los Query's Dinamicos no deben utilizarse o
tratar de utilizarlos lo menos posible.

Esta pregunta ya la hice antes, ¿Como crear un STORE de Busqueda donde el
usuario tiene multiples opciones de busqueda?

Ejemplo: Buscando al CLIENTE por NOMBRE, CODIGO POSTAL o TELEFONO.

/* INICIO DE CODIGO
CREATE PROCEDURE pr_BuscandoCliente
@NOMBRE VARCHAR(60),
@CP CHAR(5),
@TELEFONO CHAR(10)
AS

SET NOCOUNT ON
DECLARE @SQLString NVARCHAR(1000), @WHERE NVARCHAR(100), @Count_rec INT

SET @WHERE = CASE
WHEN LEN(@NOMBRE) > 0 THEN ' WHERE cNombre LIKE ' + @NOMBRE + '%'
WHEN LEN(@CP) > 0 THEN ' WHERE cCP = ' + @CP
THEN ' WHERE TELEFONO = '+@TELEFONO END

SET @SQLString = N'SELECT @Count_rec = COUNT(CLIENTE.iCTEID) FROM CLIENTE '
+ @WHERE
EXEC sp_executesql @SQLString, N'@Count_rec INT OUTPUT', @Count_rec @Count_rec OUTPUT
IF @Count_rec = 0
BEGIN
SELECT -1, 'El Cliente no existe'
RETURN(0)
END

SET @SQLString = N'SELECT cNombre, cDireccion, cCP, cTelefono FROM CLIENTE '
+ @WHERE
EXEC sp_executesql @SQLString
IF @@ROWCOUNT = 0
BEGIN
SELECT -1, 'Error al obtener los datos del cliente.
RETURN(0)
END

*/ FIN DE CODIGO

Preguntas similare

Leer las respuestas

#1 MAXI
02/07/2004 - 00:23 | Informe spam
Hola, a ver si algo asi te es util

CREATE PROC PEPITO @PARAM1,@PARAM2 AS

SELECT CAMPOS FROM TABLA WHERE CAMPO1 LIKE CASE WHEN LEN(@PARAM1)=0 THEN '%'
ELSE @PARAM1 END AND
CAMPO2 LIKE CASE WHEN LEN(@PARAM2)=0 THEN '%' ELSE @PARAM2 END


==
Yo tengo 2 SP, uno para los AND y otro para los OR, en param pongo todos los
campos y en el select tambien!!

La verdad que lo he probado con gran cantidad de registro y funciona bien!!

Suerte



Maxi

Buenos Aires - Argentina

Desarrollador .NET 3 Estrellas

Mail: Maxi_accotto[arroba]speedy.com.ar

MSN:


"Isaias Islas" escribió en el mensaje
news:%
Hola amigos todos

He escuchado mas de una vez que los Query's Dinamicos no deben utilizarse


o
tratar de utilizarlos lo menos posible.

Esta pregunta ya la hice antes, ¿Como crear un STORE de Busqueda donde el
usuario tiene multiples opciones de busqueda?

Ejemplo: Buscando al CLIENTE por NOMBRE, CODIGO POSTAL o TELEFONO.

/* INICIO DE CODIGO
CREATE PROCEDURE pr_BuscandoCliente
@NOMBRE VARCHAR(60),
@CP CHAR(5),
@TELEFONO CHAR(10)
AS

SET NOCOUNT ON
DECLARE @SQLString NVARCHAR(1000), @WHERE NVARCHAR(100), @Count_rec


INT

SET @WHERE = CASE
WHEN LEN(@NOMBRE) > 0 THEN ' WHERE cNombre LIKE ' + @NOMBRE + '%'
WHEN LEN(@CP) > 0 THEN ' WHERE cCP = ' + @CP
THEN ' WHERE TELEFONO = '+@TELEFONO END

SET @SQLString = N'SELECT @Count_rec = COUNT(CLIENTE.iCTEID) FROM CLIENTE


'
+ @WHERE
EXEC sp_executesql @SQLString, N'@Count_rec INT OUTPUT', @Count_rec > @Count_rec OUTPUT
IF @Count_rec = 0
BEGIN
SELECT -1, 'El Cliente no existe'
RETURN(0)
END

SET @SQLString = N'SELECT cNombre, cDireccion, cCP, cTelefono FROM CLIENTE


'
+ @WHERE
EXEC sp_executesql @SQLString
IF @@ROWCOUNT = 0
BEGIN
SELECT -1, 'Error al obtener los datos del cliente.
RETURN(0)
END

*/ FIN DE CODIGO


Respuesta Responder a este mensaje
#2 Isaías
02/07/2004 - 02:28 | Informe spam
Hola Maxi

Muy buen codigo, para cuando se trata de una sola TABLA,
que pasa cuando tienes varios JOIN's, te acabo de enviar
un ejemplo a tu buzon.

Saludos amigo.
Respuesta Responder a este mensaje
#3 MAXI
02/07/2004 - 03:21 | Informe spam
Es lo mismo!! arma SP por entidad (factura,clientes,pedidos,etc) y listo!!
ademas yo en los join cuando es asi uso LEFT y luego lo que hago es poner en
el where por alguna condicion (quizas parametro de entrada) si trae los
nulos (cuando no hay vinculo) o si trae los no nulos (cuando hay vinculos) o
si trae todos (los nulos y los no nulos)

Voy a ver si me hago algo de tiempo y armo algun articulo para publicar en
la web de algunos de este news asi queda mas clarito y lo pueden aprovechar
todos :-)

Un abrazo




Maxi

Buenos Aires - Argentina

Desarrollador .NET 3 Estrellas

Mail: Maxi_accotto[arroba]speedy.com.ar

MSN:


"Isaías" escribió en el mensaje
news:24a1b01c45fcb$84decbd0$
Hola Maxi

Muy buen codigo, para cuando se trata de una sola TABLA,
que pasa cuando tienes varios JOIN's, te acabo de enviar
un ejemplo a tu buzon.

Saludos amigo.
Respuesta Responder a este mensaje
#4 Isaías
02/07/2004 - 20:22 | Informe spam
Amigo Maxi.

Nos harias un gran favor, porque como te comente en el
mail, en el FRONT (ASP), el usuario tiene a la vista los
datos de esas entidades que te mande.

CLIENTE
AGENCIA
AUTO
TIPO_AUTO
CASO

Y el mismo usuario, selecciona por que dato
desea "encontrar" la información, por lo que no podria
hacer un store para cada entidad.

He intentado con los LEFT y NULL, pero aun asi no he
logrado el objetivo.

Que los "dioses" te otorguen el tiempo suficiente para
poder iluminar a los hambrientos de conocimientos como yo.

Un abrazo amigo y muchas gracias por tus consejos.
Respuesta Responder a este mensaje
#5 Maxi
02/07/2004 - 20:36 | Informe spam
Hola amigo!! a ver, me parece que me explique mal o no me has entendido bien
:(

CLIENTE
AGENCIA
AUTO
TIPO_AUTO
CASO

Esto para mi no son entidades separadas sino una sola entidad llamada
"historial_clientes"

esa entidad historial clientes tendra dentro una o mas tablas que componen
la entidad.

En tu caso es muy probable que debas unir el maestro de clientes con el
detalle de los casos, el tipo de auto con una tabla AUTOS y quizas AGENCIA
con una tabla agencia.

Todo esto es una entidad completa, pero que hago yo: no las uno por INNER
sino por LEFT, en tu caso me parece que la primer tabla deberia ser Clientes
y luego detalle con el LEFT.

Al unirlas asi me da mucha flexibidad.

En mi SP voy a tener esos datos que vos me dijiste y menciono arriba, quizas
tambie exista una consulta que diga: mostrame todos los clientes sin
movimientos.

En el SP tendre entonces los param por los que el usuario consulta y luego
haces hago el CASE con el LIKE.

Como el usuario aca puede seleccionar mas de un campo: imaginate que diga:
Tipo de autos ='MODERNO' agencia='01'

Cuando pasa eso hay 2 caminos:

1) que el usuario quiera traer todos los TIPO MODERNO "Y" la agencia 01
2) que el usuario quiera traer todos los TIPO MODERNO "O" la agencia 01

Yo que hago, en mi interfaz pongo un Radio que indica si la busqueda es por
"Y" o por "O"

Si es por "Y" uso un SP y si es por "O" uso otro.

pd: si pudieras pasarme como queres componer la entidad (campos y relaciones
a otras tablas) yo te armo un ejemplo :-)


Salu2
Maxi
Buenos Aires - Argentina
Desarrollador Microsoft 3 Estrellas .NET
Nunca consideres el estudio como una obligación sino como
una oportunidad para penetrar en el bello y maravillosos
mundo del saber.
- Albert Einstein



"Isaías" escribió en el mensaje
news:2561701c46061$94b3ebd0$
Amigo Maxi.

Nos harias un gran favor, porque como te comente en el
mail, en el FRONT (ASP), el usuario tiene a la vista los
datos de esas entidades que te mande.

CLIENTE
AGENCIA
AUTO
TIPO_AUTO
CASO

Y el mismo usuario, selecciona por que dato
desea "encontrar" la información, por lo que no podria
hacer un store para cada entidad.

He intentado con los LEFT y NULL, pero aun asi no he
logrado el objetivo.

Que los "dioses" te otorguen el tiempo suficiente para
poder iluminar a los hambrientos de conocimientos como yo.

Un abrazo amigo y muchas gracias por tus consejos.



Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.707 / Virus Database: 463 - Release Date: 15/06/2004
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida