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

#6 Liliana Sorrentino
02/07/2004 - 20:55 | Informe spam
Hola Isaías,
Supongo que Maxi se refiere a algo como este ejemplo, donde podés
reeemplazar el AND del WHERE por OR en otro SP.
Cariños... Liliana.

create table #cliente
(id_cliente char(3),
nombre char(50))
insert #cliente select '1', 'cliente 1'
insert #cliente select '2', 'cliente 2'
create index cliente on #cliente (id_cliente)

create table #agencia
(id_agencia char(3),
nombre char(50))
insert #agencia select '10', 'agencia 10'
insert #agencia select '20', 'agencia 20'
create index agencia on #agencia (id_agencia)

create table #movimientos
(id_cliente smallint,
id_agencia smallint,
fecha datetime)
insert #movimientos select '1', '10', getdate () -10
insert #movimientos select '2', '10', getdate () -5
insert #movimientos select '1', '20', getdate () -10
insert #movimientos select '2', '20', getdate () -5
insert #movimientos select '1', '10', getdate ()
insert #movimientos select '2', '10', getdate ()
create index movimientos on #movimientos (id_cliente, id_agencia)
create index movimientos1 on #movimientos (id_agencia, id_cliente)


declare @cliente char(3), @agencia char(3)
select @agencia = '10'

select c.nombre, a.nombre, fecha
from #movimientos m
left join #cliente c on c.id_cliente = m.id_cliente
left join #agencia a on a.id_agencia = m.id_agencia
where c.id_cliente LIKE isnull(@cliente + '%', '%')
and a.id_agencia LIKE isnull(@agencia + '%', '%')


"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.
Respuesta Responder a este mensaje
#7 Maxi
02/07/2004 - 21:19 | Informe spam
Veamos un ejemplo:

=
CREATE TABLE #CLIENTES (ID CHAR(10), NOMBRE VARCHAR(50), PAIS CHAR(50))

INSERT INTO #CLIENTES VALUES ('01','INTEL','USA')
INSERT INTO #CLIENTES VALUES ('02','IBM','BRAZIL')
INSERT INTO #CLIENTES VALUES ('03','MICROSOFT','USA')

CREATE TABLE #PEDIDOS (ID CHAR(10), CLIENTE_ID CHAR(10), FECHA DATETIME)

INSERT INTO #PEDIDOS VALUES ('P1','01',GETDATE())
INSERT INTO #PEDIDOS VALUES ('P2','01',GETDATE()+10)
INSERT INTO #PEDIDOS VALUES ('P3','02',GETDATE()+365)


CREATE PROC #PEDIDOS_BUSQUEDA @CLIENTE_ID VARCHAR(10), @PAIS VARCHAR(50),
@SIN_PEDIDOS CHAR(1)
AS

IF @SIN_PEDIDOS = '0'
BEGIN


SELECT #PEDIDOS.*,#CLIENTES.NOMBRE,#CLIENTES.PAIS FROM #CLIENTES LEFT
JOIN
#PEDIDOS ON
#CLIENTES.ID = #PEDIDOS.CLIENTE_ID
WHERE #CLIENTES.ID LIKE CASE WHEN LEN(@CLIENTE_ID)=0 THEN '%' ELSE
@CLIENTE_ID END
AND #CLIENTES.PAIS LIKE CASE WHEN LEN(@PAIS)=0 THEN '%' ELSE @PAIS END
END

ELSE

BEGIN

SELECT #PEDIDOS.*,#CLIENTES.NOMBRE,#CLIENTES.PAIS FROM #CLIENTES LEFT
JOIN
#PEDIDOS ON
#CLIENTES.ID = #PEDIDOS.CLIENTE_ID
WHERE #CLIENTES.ID LIKE CASE WHEN LEN(@CLIENTE_ID)=0 THEN '%' ELSE
@CLIENTE_ID END
AND #CLIENTES.PAIS LIKE CASE WHEN LEN(@PAIS)=0 THEN '%' ELSE @PAIS END
AND #PEDIDOS.CLIENTE_ID IS NULL
END




=
Fijate que defini una entidad llamada pedido y que me pueden consultar por:

Cliente
Pais

pero ademas me pueden pedir clientes sin pedidos!! :-)

Esto seria para el AND

deberias armar otro para el OR

se entiende mejor ?



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
#8 Isaías
03/07/2004 - 05:52 | Informe spam
Maxi

Como siempre, es un placer leer tus recomendaciones.

Me explico un poco mas.

Mi sistema da atencion personalizada a todos los clientes
(CLIENTE) que de alguna u otra forma, compran un AUTO, de
una MARCA (5), en una AGENCIA y reportan algun CASO
(contingencia, desperfecto, averia, etc.).

Pues bien, cuando el cliente llama al CENTRO TELFONICO
para reportar algun CASO, este cliente puede buscarse, sea
por, SU AUTO, el TIPO_AUTO que tiene, porque se acordo en
que AGENCIA lo compro.

El front (tratare de describirlo), proporciona TODAS esas
busqueda, ya sea, por NOMBRE o APELLIDO (1), por chasis
(AUTO), Placa (AUTO), marca (TIPO_AUTO) o por AGENCIA.

Es cierto, podria hacer un store por cada tipo de
busqueda, pero al final, tendre que unir TODAS las
entidades (SEPARADAS, cada una), para obtener los datos
que las relacionan.

Si bien es cierto que el cliente no puede existir, en cuyo
caso, le dare la oportunidad al operador de registralo, o
bien, que el auto en cuestion, no este registrado y que
tambien deber permitr al operador registra dicha unidad.

Espero haberme explicado, amigo Maxi.
Respuesta Responder a este mensaje
#9 MAXI
03/07/2004 - 15:52 | Informe spam
Hola amigo! te explicas re bien :-), revisa el ejemplo que yo y Liliana te
mandamos y piensa un poco en entidades (objetos) y veras que se pueden hacer
maravillas :-)

Yo te arme un ejemplo con la entidad Pedidos de Clientes, vos deberias
modelar el tuyo.

Generalmente cuando te pones a trabajar con entidades te daras cuenta lo
facil y simple que es hacerlo.

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:2637701c460b1$2c269360$
Maxi

Como siempre, es un placer leer tus recomendaciones.

Me explico un poco mas.

Mi sistema da atencion personalizada a todos los clientes
(CLIENTE) que de alguna u otra forma, compran un AUTO, de
una MARCA (5), en una AGENCIA y reportan algun CASO
(contingencia, desperfecto, averia, etc.).

Pues bien, cuando el cliente llama al CENTRO TELFONICO
para reportar algun CASO, este cliente puede buscarse, sea
por, SU AUTO, el TIPO_AUTO que tiene, porque se acordo en
que AGENCIA lo compro.

El front (tratare de describirlo), proporciona TODAS esas
busqueda, ya sea, por NOMBRE o APELLIDO (1), por chasis
(AUTO), Placa (AUTO), marca (TIPO_AUTO) o por AGENCIA.

Es cierto, podria hacer un store por cada tipo de
busqueda, pero al final, tendre que unir TODAS las
entidades (SEPARADAS, cada una), para obtener los datos
que las relacionan.

Si bien es cierto que el cliente no puede existir, en cuyo
caso, le dare la oportunidad al operador de registralo, o
bien, que el auto en cuestion, no este registrado y que
tambien deber permitr al operador registra dicha unidad.

Espero haberme explicado, amigo Maxi.
Respuesta Responder a este mensaje
#10 Lázaro
14/07/2004 - 16:00 | Informe spam
Has probado a crear un store procedure donde ir anidando las condiciones de
búsqueda y luego al final sólo devolver las filas que cumplen todas las
condiciones ?

Te pondo un ejemplo, puede que no haya entendido bien tu problema, pero a lo
mejor te sirve de algo.

create proc spConsultar @param1,@param2,@param3
as
declare @seguir bit
select @seguir = 1

declare @ncondiciones int
select @ncondiciones = 1

if @pararam1 is not null
select @ncondiciones = @ncondiciones + 1

if @pararam2 is not null
select @ncondiciones = @ncondiciones + 1

if @pararam3 is not null
select @ncondiciones = @ncondiciones + 1

create table #work(idcliente int)

insert into #work
select idcliente
from tab1 a, tab2 b
where xxxxxxxx = @param1
and a.campo1 = b.campo1

if @@rowcount = 0
select @seguir = 0

if @seguir = 1
insert into #work
select idcliente
from tab3 c, tab4 d
where xxxxxxxx = @param2
and c.campo1 = d.campo1

if @@rowcount = 0
select @seguir = 0

/* Así con todas las condiciones que necesites */

if @seguir = 1
select idcliente
from #work
group by idcliente
having count(idcliente) = @ncondiciones

Sólo serían validos aquellos registros que hayan cumplido todas las
condiciones, y en el caso de que no se haya cumplido alguna con la variable
@seguir optimizas el procedimiento para que no ejecute todo el código

No sé si te servirá de algo.

salu2





"Isaías" wrote in message
news:2637701c460b1$2c269360$
Maxi

Como siempre, es un placer leer tus recomendaciones.

Me explico un poco mas.

Mi sistema da atencion personalizada a todos los clientes
(CLIENTE) que de alguna u otra forma, compran un AUTO, de
una MARCA (5), en una AGENCIA y reportan algun CASO
(contingencia, desperfecto, averia, etc.).

Pues bien, cuando el cliente llama al CENTRO TELFONICO
para reportar algun CASO, este cliente puede buscarse, sea
por, SU AUTO, el TIPO_AUTO que tiene, porque se acordo en
que AGENCIA lo compro.

El front (tratare de describirlo), proporciona TODAS esas
busqueda, ya sea, por NOMBRE o APELLIDO (1), por chasis
(AUTO), Placa (AUTO), marca (TIPO_AUTO) o por AGENCIA.

Es cierto, podria hacer un store por cada tipo de
busqueda, pero al final, tendre que unir TODAS las
entidades (SEPARADAS, cada una), para obtener los datos
que las relacionan.

Si bien es cierto que el cliente no puede existir, en cuyo
caso, le dare la oportunidad al operador de registralo, o
bien, que el auto en cuestion, no este registrado y que
tambien deber permitr al operador registra dicha unidad.

Espero haberme explicado, amigo Maxi.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida