hacer un where @consulta???

03/07/2003 - 13:36 por Miguel Tubía | Informe spam
Hola,
tengo un procedimiento q busca un cliente; desde la aplicación, al hacer la
búsqueda, sabré unos datos, pero no siempre los mismos (según el tipo de
búsqueda, hoy sabré el nombre y mañana el dni, por ejemplo).
Para no hacer un sp por cada posible búsqueda (.) he hecho uno que le
paso todos los datos como parámetros del estilo
@Nombre varchar(50)=null output,
@Nif varchar(20)=null output,
@Domicilio varchar(70)=null output,
@CP varchar(5)=null output,
...
algunos, los q sepa en el momento de la búsqueda tendrán un valor, los q no
serán null.
Resulta q al hacer la select, en el where pongo expresiones del tipo:
Nombre=@Nombre and Nif=@Nif and.
Y claro, si alguno es null de esos, pq en la búsqueda no lo sabía, ya se
petó la búsqueda pq no me la va a hacer bien
He pensado mirar todos los parámetros y crear una variable @consulta, y si
el parámetro no es null ir construyendo la consulta para luego hacer un
where @consulta, pero claro, habréis visto q esto es una santa barbaridad, o
al menos eso me dice al comprobar la sintaxis
He buscado posibiliades del propio lenguaje sql pero me puedo eternizar
mirando, así q si alguien me puede echar una mano le estaría muy agradecido.
Espero haberme explicado más o menos
Gracias por todo
Un saludo

Preguntas similare

Leer las respuestas

#1 Carlos Sacristan
03/07/2003 - 14:02 | Informe spam
Pues tal vez (dependiendo del número de parámetros que tenga tu
procedimiento almacenado) no te interese tener esa consulta como un
procedimiento, y te comento por qué:

- Si lo que quieres es que el filtro (WHERE) no se construya
dinámicamente, tendrás que poner una condición en los parámetros que vengan
a NULL para que no falle. Algo así como, por ejemplo, nombre=ISNULL(@nombre,
nombre). Con eso se soluciona el problema de compararlo con un NULL, pero
ocurre que SQL Server no va a poder utilizar un índice que
pudiera existir en esa columna. Mira el plan de ejecución de estas
consultas, es bastante ilustrativo:
USE northwind
DECLARE @id VARCHAR(50)
SET @id= 'fuller'
campo 'lastname'
SELECT lastname FROM employees WHERE lastname=@id
SELECT lastname FROM employees WHERE lastname = ISNULL(@id,
lastname)

- Si lo que quieres es construir el filtro dinámicamente, te obligas
a usar sp_executesql o directamente EXEC(...), y no creo que vayas a obtener
muchos beneficios. Echa un vistazo a este artículo para saber por qué te
comento esto: http://www.algonet.se/~sommar/dynamic_sql.html

¿Conclusión?. Bueno, yo creo que lo que haría sería crear una vista
sobre la tabla y, por supuesto, crear los índices que mejor le vengan
(puedes utilizar el asistente si quieres), para luego llamar a dicha vista
con el filtro ya construido en la aplicación cliente.


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

(Guía de netiquette del foro)
http://www.helpdna.net/bosqlfaq00.htm
http://perso.wanadoo.es/rubenvigon/foro

(FAQ's de SQL Server)
http://support.microsoft.com/defaul.../70faq.asp
http://www.helpdna.net/bosqlfaq.htm

"Miguel Tubía" <########> escribió en el mensaje
news:
Hola,
tengo un procedimiento q busca un cliente; desde la aplicación, al hacer


la
búsqueda, sabré unos datos, pero no siempre los mismos (según el tipo de
búsqueda, hoy sabré el nombre y mañana el dni, por ejemplo).
Para no hacer un sp por cada posible búsqueda (.) he hecho uno que le
paso todos los datos como parámetros del estilo
@Nombre varchar(50)=null output,
@Nif varchar(20)=null output,
@Domicilio varchar(70)=null output,
@CP varchar(5)=null output,
...
algunos, los q sepa en el momento de la búsqueda tendrán un valor, los q


no
serán null.
Resulta q al hacer la select, en el where pongo expresiones del tipo:
Nombre=@Nombre and Nif=@Nif and.
Y claro, si alguno es null de esos, pq en la búsqueda no lo sabía, ya se
petó la búsqueda pq no me la va a hacer bien
He pensado mirar todos los parámetros y crear una variable @consulta, y si
el parámetro no es null ir construyendo la consulta para luego hacer un
where @consulta, pero claro, habréis visto q esto es una santa barbaridad,


o
al menos eso me dice al comprobar la sintaxis
He buscado posibiliades del propio lenguaje sql pero me puedo eternizar
mirando, así q si alguien me puede echar una mano le estaría muy


agradecido.
Espero haberme explicado más o menos
Gracias por todo
Un saludo


Respuesta Responder a este mensaje
#2 Ever Varela
03/07/2003 - 16:37 | Informe spam
@Nombre varchar(50)=null output,
@Nif varchar(20)=null output,
@Domicilio varchar(70)=null output,
@CP varchar(5)=null output,
...


supongo que envez de nulls podrás pasar al menos commillas '' simples de
manera que no queden null y construyes el where de la siguiente manera

where Nombre = case @nombre
when '' then
Nombre
else @nombre end

and Nif = case @Nif
when '' then
Nif
else @Nif end

and Domicilio = Case @Domicilio
when '' then
Domicilio
else @Domicilio end
and cp = Case @CP
when '' then
CP
else @Cp end


en este caso tienes un where que dice si la variable tiene un valor filtrame
por ese valor pero si no lo tiene filtrame por el valor del campo en la
tabla (o lo que es lo mismo no filtres)

espero te sirva

un saludo

Ever Varela
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida