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
 

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


Preguntas similares