WHERE en SP

18/09/2007 - 14:07 por Gabriel Dameñov | Informe spam
Estimados:
¿Es posible, sin repetir las consultas con diferentes WHERE, hacer que
un WHERE se ejecute o NO dependiendo del valor de un parámetro?
Por ejemplo, si el parámetro @a = 1, se filtra la WHERE columna = 1, si
@a IS NULL, no se filtra. ¿Alguna idea?

Saludos y gracias.


Gabriel J. Dameñov
-

Preguntas similare

Leer las respuestas

#1 Carlos M. Calvelo
18/09/2007 - 14:18 | Informe spam
On 18 sep, 14:07, "Gabriel Dameñov" wrote:
Estimados:
¿Es posible, sin repetir las consultas con diferentes WHERE, hacer que
un WHERE se ejecute o NO dependiendo del valor de un parámetro?
Por ejemplo, si el parámetro @a = 1, se filtra la WHERE columna = 1, si
@a IS NULL, no se filtra. ¿Alguna idea?

Saludos y gracias.




Es esto lo que quieres decir?

WHERE @a IS NULL OR columna = @a

Saludos,
Carlos
Respuesta Responder a este mensaje
#2 Maxi
18/09/2007 - 15:35 | Informe spam
Hola, le recomiendo una lectura por este articulo

http://www.sommarskog.se/dyn-search.html


Salu2

Microsoft MVP SQL Server
Culminis Speaker

"Gabriel Dameñov" escribió en el mensaje
news:%23DwN4xe%
Estimados:
¿Es posible, sin repetir las consultas con diferentes WHERE, hacer que
un WHERE se ejecute o NO dependiendo del valor de un parámetro?
Por ejemplo, si el parámetro @a = 1, se filtra la WHERE columna = 1, si
@a IS NULL, no se filtra. ¿Alguna idea?

Saludos y gracias.


Gabriel J. Dameñov
-


Respuesta Responder a este mensaje
#3 Alejandro Mesa
18/09/2007 - 15:48 | Informe spam
Hola Carlos,

El optimizador de queries no escoje un buen plan de ejecucion cuando se usa
ese tipo de expresion en el filtro.

(columna = parametro or parametro is null)

Veamos un ejemplo:

use northwind
go

create procedure dbo.usp_p1
@orderid int
as
set nocount on

select orderid, orderdate, customerid
from dbo.orders
where orderid = @orderid or @orderid is null
go

set showplan_text on
go

exec dbo.usp_p1 null
go

exec dbo.usp_p1 10250
go

set showplan_text off
go

drop procedure dbo.usp_p1
go

Esete es el resultado de ambos estimados:

|--Clustered Index
Scan(OBJECT:([Northwind].[dbo].[Orders].[PK_Orders]),
WHERE:([Northwind].[dbo].[Orders].[OrderID]=[@orderid] OR [@orderid] IS NULL))

Como puedes ver, el optimizador decide hacer un scan del indice clustered,
aunque sabemos que la clave primaria de esa tabla es la columna [orderid],
por lo cual el indice tiene una alta selectividad (menos filas para un
determinado valor de la clave).

Cambiemos un poco el sp. Sabemos que la columna [orderid] es [int] y que sus
valores son mayor a cero. Ademas sabemos que existe un indice clustered unico
por esa columna.

alter procedure dbo.usp_p1
@orderid int
as
set nocount on

select orderid, orderdate, customerid
from dbo.orders
where orderid between coalesce(@orderid, 0) and coalesce(@orderid,
convert(int, 0x7FFFFFFF))
go

set showplan_text on
go

exec dbo.usp_p1 null
go

exec dbo.usp_p1 10250
go

set showplan_text off
go

Este es el resultado del estimado para ambas ejecuciones.

|--Clustered Index
Seek(OBJECT:([Northwind].[dbo].[Orders].[PK_Orders]),
SEEK:([Northwind].[dbo].[Orders].[OrderID] >= CASE WHEN [@orderid] IS NOT
NULL THEN [@orderid] ELSE (0) END AND [Northwind].[dbo].[Orders].[OrderID] <=
CASE WHEN [@orderid] IS NOT NULL THEN [@orderid] ELSE (2147483647) END)
ORDERED FORWARD)

El optimizador ahora decide hacer un "index seek" en el indice clustered.
Esta operacion suele ser mas eficiente.

Aca les paso un tremendo articulo sobre busquedas dinamicas en T-SQL
(lastima esta en Ingles), pero tambien les paso otro articulo que puede ser
de mucha ayuda y que esta en Español.

Dynamic Search Conditions in T-SQL
http://www.sommarskog.se/dyn-search.html

Las virtudes y maldades del SQL dinámico
http://www.hayes.ch/sql/sql_dinamico.html


AMB


"Carlos M. Calvelo" wrote:

On 18 sep, 14:07, "Gabriel Dameñov" wrote:
> Estimados:
> ¿Es posible, sin repetir las consultas con diferentes WHERE, hacer que
> un WHERE se ejecute o NO dependiendo del valor de un parámetro?
> Por ejemplo, si el parámetro @a = 1, se filtra la WHERE columna = 1, si
> @a IS NULL, no se filtra. ¿Alguna idea?
>
> Saludos y gracias.
>

Es esto lo que quieres decir?

WHERE @a IS NULL OR columna = @a

Saludos,
Carlos


Respuesta Responder a este mensaje
#4 Gabriel Dameñov
19/09/2007 - 14:01 | Informe spam
Gracias a todos.
Maxi: es lo que estaba necesitando.
Un cordial saludo.


Gabriel J. Dameñov

-
"Gabriel Dameñov" escribió en el mensaje
news:%23DwN4xe%
Estimados:
¿Es posible, sin repetir las consultas con diferentes WHERE, hacer que
un WHERE se ejecute o NO dependiendo del valor de un parámetro?
Por ejemplo, si el parámetro @a = 1, se filtra la WHERE columna = 1, si
@a IS NULL, no se filtra. ¿Alguna idea?

Saludos y gracias.


Gabriel J. Dameñov
-


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