Hacer un solo select

18/10/2006 - 19:26 por Erik Martinez | Informe spam
hola a todos.

a continuación les presento un procedimiento almacenado que hice:

CREATE PROCEDURE sp_ProdEstOri
@Filtro int,
@Valor int
as

if @filtro=1
begin
select listacampos from tablas
end
else
begin
if @filtro=2
begin
select listacampos from tablas where campo1=@valor
end
else
begin
if @filtro=3
begin
select listacampos from tablas where campo2=@valor
end
else
begin
select listacampos from tablas where campo3=@valor
end
end
end
go

notaran que las diferencias en los 4 select es: que en el primero no existe
la clausula where.
y en los otros 3 el nombre del campo cambia en la clausula where.

¿De que forma puedo hacer un solo select y cambiar la condición por medio
de una variable.?

de antemano muchas gracias.

Preguntas similare

Leer las respuestas

#6 Miguel Egea
18/10/2006 - 22:12 | Informe spam
tu verás, pero debes ser consciente de que igual trab ajas un montón para
hacer los procedimientos y cuando los pongas en producción te toca
convertirlos en varios.

Saludos
Miguel Egea
"Erik Martinez" <nadie@@microsoft.com> wrote in message
news:
Bueno ese tipo de select lo tengo que hacer en muchas operaciones ya que
es para filtrar reportes y gráficos y no quiero llegar a tener una
barbaridad de
procedimientos almacenados.
ojala pudieran recomendarme algo mejor.
Un compañero me ayudo a realizar un solo select, a continuación se los
presento y asi saber sus comentarios y recomendaciones con respecto a
esto.
CREATE PROCEDURE sp_ProdEstOri
@Filtro int,
@Valor int
as
select * from tablas where
campo1=case when @Filtro=2 then @Valor else campo1 end and
campo2=case when @Filtro=3 then @Valor else campo2 end and
campo3=case when @Filtro=4 then @Valor else campo3 end
go

Respuesta Responder a este mensaje
#7 Erik Martinez
18/10/2006 - 22:57 | Informe spam
Agradezco mucho sus comentarios y recomendaciones.
se me ocurrio mejor presentarles los 2 procedimientos almacenados reales
para que vean las dif. y seguir leyendo sus recomendaciones.

1era forma (un solo select) "la que me parece mejor"

create PROCEDURE sp_ProdEstOri
@IDUsuario int,
@Filtro int,
@Valor int,
@Eslaguna int
AS
filtros

SELECT dbo.GenEstOri.Ciclo, dbo.GenLagunas.IDLaguna,
dbo.GenLagunas.Laguna, dbo.GenLagunas.Hectareas, dbo.GenEstOri.LagCiclo,
dbo.GenEstOri.FecSiembra, dbo.GenEstOri.Densidad,
dbo.GenEstOri.TipoSiembra, dbo.GenEstOri.FCA, dbo.GenEstOri.Diascult,
dbo.GenEstOri.FecSiembra + dbo.GenEstOri.Diascult AS
Fecose, dbo.GenEstOri.DiasSeca, dbo.GenEstOri.CrecSem,
dbo.GenEstOri.Diascult / 7 * dbo.GenEstOri.CrecSem AS
PesoCos, dbo.GenEstOri.PorSup,
dbo.GenEstOri.Densidad * dbo.GenEstOri.PorSup / 100
AS camcosm2, dbo.GenEstOri.PesoCola, ((dbo.GenEstOri.Densidad * 10000)
* (dbo.GenEstOri.PorSup / 100)) *
(dbo.GenEstOri.Diascult / 7 * dbo.GenEstOri.CrecSem) / 454 *
dbo.GenEstOri.PesoCola AS rendhas,
((dbo.GenEstOri.Densidad * 10000) *
(dbo.GenEstOri.PorSup / 100)) * (dbo.GenEstOri.Diascult / 7 *
dbo.GenEstOri.CrecSem)
/ 454 * dbo.GenEstOri.PesoCola *
dbo.GenLagunas.Hectareas AS Libras
FROM dbo.GenEstOri INNER JOIN
dbo.GenLagunas ON dbo.GenEstOri.IDLaguna =
dbo.GenLagunas.IDLaguna INNER JOIN
dbo.GenAcSec ON dbo.GenLagunas.IDSector =
dbo.GenAcSec.IDSector INNER JOIN
dbo.GenSectores ON dbo.GenLagunas.IDSector =
dbo.GenSectores.IDSector AND dbo.GenAcSec.IDSector =
dbo.GenSectores.IDSector
WHERE GenAcSec.IDUser=@IDUsuario and
GenLagunas.Eslaguna=@Eslaguna and
GenSectores.IDFinca=case when @Filtro=2 then @Valor else
GenSectores.IDFinca end and
GenLagunas.IDSector=case when @Filtro=3 then @Valor else
GenLagunas.IDSector end and
GenLagunas.IDLaguna=case when @Filtro=4 then @Valor else
GenLagunas.IDLaguna end
GO


2da forma(varios select)

CREATE PROCEDURE sp_ProdEstOri
@IDUsuario int,
@Filtro int,
@Valor int,
@Eslaguna int
AS
filtros
if @Filtro=1
begin
SELECT dbo.GenEstOri.Ciclo, dbo.GenLagunas.IDLaguna,
dbo.GenLagunas.Laguna, dbo.GenLagunas.Hectareas, dbo.GenEstOri.LagCiclo,
dbo.GenEstOri.FecSiembra, dbo.GenEstOri.Densidad,
dbo.GenEstOri.TipoSiembra, dbo.GenEstOri.FCA, dbo.GenEstOri.Diascult,
dbo.GenEstOri.FecSiembra + dbo.GenEstOri.Diascult AS
Fecose, dbo.GenEstOri.DiasSeca, dbo.GenEstOri.CrecSem,
dbo.GenEstOri.Diascult / 7 * dbo.GenEstOri.CrecSem AS
PesoCos, dbo.GenEstOri.PorSup,
dbo.GenEstOri.Densidad * dbo.GenEstOri.PorSup / 100
AS camcosm2, dbo.GenEstOri.PesoCola, ((dbo.GenEstOri.Densidad * 10000)
* (dbo.GenEstOri.PorSup / 100)) *
(dbo.GenEstOri.Diascult / 7 * dbo.GenEstOri.CrecSem) / 454 *
dbo.GenEstOri.PesoCola AS rendhas,
((dbo.GenEstOri.Densidad * 10000) *
(dbo.GenEstOri.PorSup / 100)) * (dbo.GenEstOri.Diascult / 7 *
dbo.GenEstOri.CrecSem)
/ 454 * dbo.GenEstOri.PesoCola *
dbo.GenLagunas.Hectareas AS Libras
FROM dbo.GenEstOri INNER JOIN
dbo.GenLagunas ON dbo.GenEstOri.IDLaguna =
dbo.GenLagunas.IDLaguna INNER JOIN
dbo.GenAcSec ON dbo.GenLagunas.IDSector =
dbo.GenAcSec.IDSector INNER JOIN
dbo.GenSectores ON dbo.GenLagunas.IDSector =
dbo.GenSectores.IDSector AND dbo.GenAcSec.IDSector =
dbo.GenSectores.IDSector
WHERE GenAcSec.IDUser=@IDUsuario and GenLagunas.Eslaguna=@Eslaguna
end
else
begin
if @Filtro=2
begin
SELECT dbo.GenEstOri.Ciclo, dbo.GenLagunas.IDLaguna,
dbo.GenLagunas.Laguna, dbo.GenLagunas.Hectareas, dbo.GenEstOri.LagCiclo,
dbo.GenEstOri.FecSiembra, dbo.GenEstOri.Densidad,
dbo.GenEstOri.TipoSiembra, dbo.GenEstOri.FCA, dbo.GenEstOri.Diascult,
dbo.GenEstOri.FecSiembra + dbo.GenEstOri.Diascult AS
Fecose, dbo.GenEstOri.DiasSeca, dbo.GenEstOri.CrecSem,
dbo.GenEstOri.Diascult / 7 * dbo.GenEstOri.CrecSem AS
PesoCos, dbo.GenEstOri.PorSup,
dbo.GenEstOri.Densidad * dbo.GenEstOri.PorSup / 100
AS camcosm2, dbo.GenEstOri.PesoCola, ((dbo.GenEstOri.Densidad * 10000)
* (dbo.GenEstOri.PorSup / 100)) *
(dbo.GenEstOri.Diascult / 7 * dbo.GenEstOri.CrecSem) / 454 *
dbo.GenEstOri.PesoCola AS rendhas,
((dbo.GenEstOri.Densidad * 10000) *
(dbo.GenEstOri.PorSup / 100)) * (dbo.GenEstOri.Diascult / 7 *
dbo.GenEstOri.CrecSem)
/ 454 * dbo.GenEstOri.PesoCola *
dbo.GenLagunas.Hectareas AS Libras
FROM dbo.GenEstOri INNER JOIN
dbo.GenLagunas ON dbo.GenEstOri.IDLaguna =
dbo.GenLagunas.IDLaguna INNER JOIN
dbo.GenAcSec ON dbo.GenLagunas.IDSector =
dbo.GenAcSec.IDSector INNER JOIN
dbo.GenSectores ON dbo.GenLagunas.IDSector =
dbo.GenSectores.IDSector AND dbo.GenAcSec.IDSector =
dbo.GenSectores.IDSector
WHERE GenAcSec.IDUser=@IDUsuario and GenLagunas.Eslaguna=@Eslaguna
and GenSectores.IDFinca=@Valor

end
else
begin
if @Filtro=3
begin
SELECT dbo.GenEstOri.Ciclo, dbo.GenLagunas.IDLaguna,
dbo.GenLagunas.Laguna, dbo.GenLagunas.Hectareas, dbo.GenEstOri.LagCiclo,
dbo.GenEstOri.FecSiembra, dbo.GenEstOri.Densidad,
dbo.GenEstOri.TipoSiembra, dbo.GenEstOri.FCA, dbo.GenEstOri.Diascult,
dbo.GenEstOri.FecSiembra + dbo.GenEstOri.Diascult AS
Fecose, dbo.GenEstOri.DiasSeca, dbo.GenEstOri.CrecSem,
dbo.GenEstOri.Diascult / 7 * dbo.GenEstOri.CrecSem
AS PesoCos, dbo.GenEstOri.PorSup,
dbo.GenEstOri.Densidad * dbo.GenEstOri.PorSup / 100
AS camcosm2, dbo.GenEstOri.PesoCola, ((dbo.GenEstOri.Densidad * 10000)
* (dbo.GenEstOri.PorSup / 100)) *
(dbo.GenEstOri.Diascult / 7 * dbo.GenEstOri.CrecSem) / 454 *
dbo.GenEstOri.PesoCola AS rendhas,
((dbo.GenEstOri.Densidad * 10000) *
(dbo.GenEstOri.PorSup / 100)) * (dbo.GenEstOri.Diascult / 7 *
dbo.GenEstOri.CrecSem)
/ 454 * dbo.GenEstOri.PesoCola *
dbo.GenLagunas.Hectareas AS Libras
FROM dbo.GenEstOri INNER JOIN
dbo.GenLagunas ON dbo.GenEstOri.IDLaguna =
dbo.GenLagunas.IDLaguna INNER JOIN
dbo.GenAcSec ON dbo.GenLagunas.IDSector =
dbo.GenAcSec.IDSector INNER JOIN
dbo.GenSectores ON dbo.GenLagunas.IDSector =
dbo.GenSectores.IDSector AND dbo.GenAcSec.IDSector =
dbo.GenSectores.IDSector
WHERE GenAcSec.IDUser=@IDUsuario and GenLagunas.Eslaguna=@Eslaguna
and GenLagunas.IDSector=@Valor

end
else
begin
SELECT dbo.GenEstOri.Ciclo, dbo.GenLagunas.IDLaguna,
dbo.GenLagunas.Laguna, dbo.GenLagunas.Hectareas, dbo.GenEstOri.LagCiclo,
dbo.GenEstOri.FecSiembra, dbo.GenEstOri.Densidad,
dbo.GenEstOri.TipoSiembra, dbo.GenEstOri.FCA, dbo.GenEstOri.Diascult,
dbo.GenEstOri.FecSiembra + dbo.GenEstOri.Diascult AS
Fecose, dbo.GenEstOri.DiasSeca, dbo.GenEstOri.CrecSem,
dbo.GenEstOri.Diascult / 7 * dbo.GenEstOri.CrecSem
AS PesoCos, dbo.GenEstOri.PorSup,
dbo.GenEstOri.Densidad * dbo.GenEstOri.PorSup / 100
AS camcosm2, dbo.GenEstOri.PesoCola, ((dbo.GenEstOri.Densidad * 10000)
* (dbo.GenEstOri.PorSup / 100)) *
(dbo.GenEstOri.Diascult / 7 * dbo.GenEstOri.CrecSem) / 454 *
dbo.GenEstOri.PesoCola AS rendhas,
((dbo.GenEstOri.Densidad * 10000) *
(dbo.GenEstOri.PorSup / 100)) * (dbo.GenEstOri.Diascult / 7 *
dbo.GenEstOri.CrecSem)
/ 454 * dbo.GenEstOri.PesoCola *
dbo.GenLagunas.Hectareas AS Libras
FROM dbo.GenEstOri INNER JOIN
dbo.GenLagunas ON dbo.GenEstOri.IDLaguna =
dbo.GenLagunas.IDLaguna INNER JOIN
dbo.GenAcSec ON dbo.GenLagunas.IDSector =
dbo.GenAcSec.IDSector INNER JOIN
dbo.GenSectores ON dbo.GenLagunas.IDSector =
dbo.GenSectores.IDSector AND dbo.GenAcSec.IDSector =
dbo.GenSectores.IDSector
WHERE GenAcSec.IDUser=@IDUsuario and GenLagunas.Eslaguna=@Eslaguna
and GenLagunas.IDLaguna=@Valor

end
end
end
GO
Respuesta Responder a este mensaje
#8 Miguel Egea
18/10/2006 - 23:04 | Informe spam
haz una cosa para despejar tus dudas, crea los dos, preparaté un juego de
llamadas con parámetros diferentes e invocalos teniendo puesto
set statistics io on

Con los resultados nos cuentas e intentamos explicartelo :)

"Erik Martinez" <nadie@@microsoft.com> wrote in message
news:
Agradezco mucho sus comentarios y recomendaciones.
se me ocurrio mejor presentarles los 2 procedimientos almacenados reales
para que vean las dif. y seguir leyendo sus recomendaciones.

1era forma (un solo select) "la que me parece mejor"

create PROCEDURE sp_ProdEstOri
@IDUsuario int,
@Filtro int,
@Valor int,
@Eslaguna int
AS
filtros

SELECT dbo.GenEstOri.Ciclo, dbo.GenLagunas.IDLaguna,
dbo.GenLagunas.Laguna, dbo.GenLagunas.Hectareas, dbo.GenEstOri.LagCiclo,
dbo.GenEstOri.FecSiembra, dbo.GenEstOri.Densidad,
dbo.GenEstOri.TipoSiembra, dbo.GenEstOri.FCA, dbo.GenEstOri.Diascult,
dbo.GenEstOri.FecSiembra + dbo.GenEstOri.Diascult AS
Fecose, dbo.GenEstOri.DiasSeca, dbo.GenEstOri.CrecSem,
dbo.GenEstOri.Diascult / 7 * dbo.GenEstOri.CrecSem
AS PesoCos, dbo.GenEstOri.PorSup,
dbo.GenEstOri.Densidad * dbo.GenEstOri.PorSup / 100
AS camcosm2, dbo.GenEstOri.PesoCola, ((dbo.GenEstOri.Densidad * 10000)
* (dbo.GenEstOri.PorSup / 100)) *
(dbo.GenEstOri.Diascult / 7 * dbo.GenEstOri.CrecSem) / 454 *
dbo.GenEstOri.PesoCola AS rendhas,
((dbo.GenEstOri.Densidad * 10000) *
(dbo.GenEstOri.PorSup / 100)) * (dbo.GenEstOri.Diascult / 7 *
dbo.GenEstOri.CrecSem)
/ 454 * dbo.GenEstOri.PesoCola *
dbo.GenLagunas.Hectareas AS Libras
FROM dbo.GenEstOri INNER JOIN
dbo.GenLagunas ON dbo.GenEstOri.IDLaguna =
dbo.GenLagunas.IDLaguna INNER JOIN
dbo.GenAcSec ON dbo.GenLagunas.IDSector =
dbo.GenAcSec.IDSector INNER JOIN
dbo.GenSectores ON dbo.GenLagunas.IDSector =
dbo.GenSectores.IDSector AND dbo.GenAcSec.IDSector =
dbo.GenSectores.IDSector
WHERE GenAcSec.IDUser=@IDUsuario and
GenLagunas.Eslaguna=@Eslaguna and
GenSectores.IDFinca=case when @Filtro=2 then @Valor else
GenSectores.IDFinca end and
GenLagunas.IDSector=case when @Filtro=3 then @Valor else
GenLagunas.IDSector end and
GenLagunas.IDLaguna=case when @Filtro=4 then @Valor else
GenLagunas.IDLaguna end
GO


2da forma(varios select)

CREATE PROCEDURE sp_ProdEstOri
@IDUsuario int,
@Filtro int,
@Valor int,
@Eslaguna int
AS
filtros
if @Filtro=1
begin
SELECT dbo.GenEstOri.Ciclo, dbo.GenLagunas.IDLaguna,
dbo.GenLagunas.Laguna, dbo.GenLagunas.Hectareas, dbo.GenEstOri.LagCiclo,
dbo.GenEstOri.FecSiembra, dbo.GenEstOri.Densidad,
dbo.GenEstOri.TipoSiembra, dbo.GenEstOri.FCA, dbo.GenEstOri.Diascult,
dbo.GenEstOri.FecSiembra + dbo.GenEstOri.Diascult AS
Fecose, dbo.GenEstOri.DiasSeca, dbo.GenEstOri.CrecSem,
dbo.GenEstOri.Diascult / 7 * dbo.GenEstOri.CrecSem
AS PesoCos, dbo.GenEstOri.PorSup,
dbo.GenEstOri.Densidad * dbo.GenEstOri.PorSup / 100
AS camcosm2, dbo.GenEstOri.PesoCola, ((dbo.GenEstOri.Densidad * 10000)
* (dbo.GenEstOri.PorSup / 100)) *
(dbo.GenEstOri.Diascult / 7 * dbo.GenEstOri.CrecSem) / 454 *
dbo.GenEstOri.PesoCola AS rendhas,
((dbo.GenEstOri.Densidad * 10000) *
(dbo.GenEstOri.PorSup / 100)) * (dbo.GenEstOri.Diascult / 7 *
dbo.GenEstOri.CrecSem)
/ 454 * dbo.GenEstOri.PesoCola *
dbo.GenLagunas.Hectareas AS Libras
FROM dbo.GenEstOri INNER JOIN
dbo.GenLagunas ON dbo.GenEstOri.IDLaguna =
dbo.GenLagunas.IDLaguna INNER JOIN
dbo.GenAcSec ON dbo.GenLagunas.IDSector =
dbo.GenAcSec.IDSector INNER JOIN
dbo.GenSectores ON dbo.GenLagunas.IDSector =
dbo.GenSectores.IDSector AND dbo.GenAcSec.IDSector =
dbo.GenSectores.IDSector
WHERE GenAcSec.IDUser=@IDUsuario and GenLagunas.Eslaguna=@Eslaguna
end
else
begin
if @Filtro=2
begin
SELECT dbo.GenEstOri.Ciclo, dbo.GenLagunas.IDLaguna,
dbo.GenLagunas.Laguna, dbo.GenLagunas.Hectareas, dbo.GenEstOri.LagCiclo,
dbo.GenEstOri.FecSiembra, dbo.GenEstOri.Densidad,
dbo.GenEstOri.TipoSiembra, dbo.GenEstOri.FCA, dbo.GenEstOri.Diascult,
dbo.GenEstOri.FecSiembra + dbo.GenEstOri.Diascult AS
Fecose, dbo.GenEstOri.DiasSeca, dbo.GenEstOri.CrecSem,
dbo.GenEstOri.Diascult / 7 * dbo.GenEstOri.CrecSem
AS PesoCos, dbo.GenEstOri.PorSup,
dbo.GenEstOri.Densidad * dbo.GenEstOri.PorSup / 100
AS camcosm2, dbo.GenEstOri.PesoCola, ((dbo.GenEstOri.Densidad * 10000)
* (dbo.GenEstOri.PorSup / 100)) *
(dbo.GenEstOri.Diascult / 7 * dbo.GenEstOri.CrecSem) / 454 *
dbo.GenEstOri.PesoCola AS rendhas,
((dbo.GenEstOri.Densidad * 10000) *
(dbo.GenEstOri.PorSup / 100)) * (dbo.GenEstOri.Diascult / 7 *
dbo.GenEstOri.CrecSem)
/ 454 * dbo.GenEstOri.PesoCola *
dbo.GenLagunas.Hectareas AS Libras
FROM dbo.GenEstOri INNER JOIN
dbo.GenLagunas ON dbo.GenEstOri.IDLaguna =
dbo.GenLagunas.IDLaguna INNER JOIN
dbo.GenAcSec ON dbo.GenLagunas.IDSector =
dbo.GenAcSec.IDSector INNER JOIN
dbo.GenSectores ON dbo.GenLagunas.IDSector =
dbo.GenSectores.IDSector AND dbo.GenAcSec.IDSector =
dbo.GenSectores.IDSector
WHERE GenAcSec.IDUser=@IDUsuario and GenLagunas.Eslaguna=@Eslaguna
and GenSectores.IDFinca=@Valor

end
else
begin
if @Filtro=3
begin
SELECT dbo.GenEstOri.Ciclo, dbo.GenLagunas.IDLaguna,
dbo.GenLagunas.Laguna, dbo.GenLagunas.Hectareas, dbo.GenEstOri.LagCiclo,
dbo.GenEstOri.FecSiembra, dbo.GenEstOri.Densidad,
dbo.GenEstOri.TipoSiembra, dbo.GenEstOri.FCA, dbo.GenEstOri.Diascult,
dbo.GenEstOri.FecSiembra + dbo.GenEstOri.Diascult
AS Fecose, dbo.GenEstOri.DiasSeca, dbo.GenEstOri.CrecSem,
dbo.GenEstOri.Diascult / 7 * dbo.GenEstOri.CrecSem
AS PesoCos, dbo.GenEstOri.PorSup,
dbo.GenEstOri.Densidad * dbo.GenEstOri.PorSup / 100
AS camcosm2, dbo.GenEstOri.PesoCola, ((dbo.GenEstOri.Densidad * 10000)
* (dbo.GenEstOri.PorSup / 100)) *
(dbo.GenEstOri.Diascult / 7 * dbo.GenEstOri.CrecSem) / 454 *
dbo.GenEstOri.PesoCola AS rendhas,
((dbo.GenEstOri.Densidad * 10000) *
(dbo.GenEstOri.PorSup / 100)) * (dbo.GenEstOri.Diascult / 7 *
dbo.GenEstOri.CrecSem)
/ 454 * dbo.GenEstOri.PesoCola *
dbo.GenLagunas.Hectareas AS Libras
FROM dbo.GenEstOri INNER JOIN
dbo.GenLagunas ON dbo.GenEstOri.IDLaguna =
dbo.GenLagunas.IDLaguna INNER JOIN
dbo.GenAcSec ON dbo.GenLagunas.IDSector =
dbo.GenAcSec.IDSector INNER JOIN
dbo.GenSectores ON dbo.GenLagunas.IDSector =
dbo.GenSectores.IDSector AND dbo.GenAcSec.IDSector =
dbo.GenSectores.IDSector
WHERE GenAcSec.IDUser=@IDUsuario and
GenLagunas.Eslaguna=@Eslaguna and GenLagunas.IDSector=@Valor

end
else
begin
SELECT dbo.GenEstOri.Ciclo, dbo.GenLagunas.IDLaguna,
dbo.GenLagunas.Laguna, dbo.GenLagunas.Hectareas, dbo.GenEstOri.LagCiclo,
dbo.GenEstOri.FecSiembra, dbo.GenEstOri.Densidad,
dbo.GenEstOri.TipoSiembra, dbo.GenEstOri.FCA, dbo.GenEstOri.Diascult,
dbo.GenEstOri.FecSiembra + dbo.GenEstOri.Diascult
AS Fecose, dbo.GenEstOri.DiasSeca, dbo.GenEstOri.CrecSem,
dbo.GenEstOri.Diascult / 7 * dbo.GenEstOri.CrecSem
AS PesoCos, dbo.GenEstOri.PorSup,
dbo.GenEstOri.Densidad * dbo.GenEstOri.PorSup / 100
AS camcosm2, dbo.GenEstOri.PesoCola, ((dbo.GenEstOri.Densidad * 10000)
* (dbo.GenEstOri.PorSup / 100)) *
(dbo.GenEstOri.Diascult / 7 * dbo.GenEstOri.CrecSem) / 454 *
dbo.GenEstOri.PesoCola AS rendhas,
((dbo.GenEstOri.Densidad * 10000) *
(dbo.GenEstOri.PorSup / 100)) * (dbo.GenEstOri.Diascult / 7 *
dbo.GenEstOri.CrecSem)
/ 454 * dbo.GenEstOri.PesoCola *
dbo.GenLagunas.Hectareas AS Libras
FROM dbo.GenEstOri INNER JOIN
dbo.GenLagunas ON dbo.GenEstOri.IDLaguna =
dbo.GenLagunas.IDLaguna INNER JOIN
dbo.GenAcSec ON dbo.GenLagunas.IDSector =
dbo.GenAcSec.IDSector INNER JOIN
dbo.GenSectores ON dbo.GenLagunas.IDSector =
dbo.GenSectores.IDSector AND dbo.GenAcSec.IDSector =
dbo.GenSectores.IDSector
WHERE GenAcSec.IDUser=@IDUsuario and
GenLagunas.Eslaguna=@Eslaguna and GenLagunas.IDLaguna=@Valor

end
end
end
GO



Respuesta Responder a este mensaje
#9 Alejandro Mesa
19/10/2006 - 15:39 | Informe spam
Erik,

Ojala y no mal interpretes mi comentario. La recomendacion que te dieron no
es buena, puesto que al comparar una columna consigo misma SQL Server no
usara los indices de forma optima y posiblemente escoja hacer un scan de
algun indice o de la tabla y estas operaciones son deben evitarse lo mas
posible.

Compara los planes de ejecucion y estadisticas de entrada / salida de el
procedimiento que usa la recomendacion que te dieron y un procedmineto por
cada posible busqueda. Luego nos pasa el resultado.

create PROCEDURE dbo.sp_ProdEstOri_por_finca
@IDUsuario int,
@@IDFinca int,
@Eslaguna int
AS
set nocount on

SELECT
dbo.GenEstOri.Ciclo,
dbo.GenLagunas.IDLaguna,
dbo.GenLagunas.Laguna,
dbo.GenLagunas.Hectareas,
dbo.GenEstOri.LagCiclo,
dbo.GenEstOri.FecSiembra,
dbo.GenEstOri.Densidad,
dbo.GenEstOri.TipoSiembra,
dbo.GenEstOri.FCA, dbo.GenEstOri.Diascult,
dbo.GenEstOri.FecSiembra + dbo.GenEstOri.Diascult AS Fecose,
dbo.GenEstOri.DiasSeca,
dbo.GenEstOri.CrecSem,
dbo.GenEstOri.Diascult / 7 * dbo.GenEstOri.CrecSem AS PesoCos,
dbo.GenEstOri.PorSup,
dbo.GenEstOri.Densidad * dbo.GenEstOri.PorSup / 100 AS camcosm2,
dbo.GenEstOri.PesoCola,
((dbo.GenEstOri.Densidad * 10000) * (dbo.GenEstOri.PorSup / 100)) *
(dbo.GenEstOri.Diascult / 7 * dbo.GenEstOri.CrecSem) / 454 *
dbo.GenEstOri.PesoCola AS rendhas,
((dbo.GenEstOri.Densidad * 10000) * (dbo.GenEstOri.PorSup / 100)) *
(dbo.GenEstOri.Diascult / 7 * dbo.GenEstOri.CrecSem) / 454 *
dbo.GenEstOri.PesoCola * dbo.GenLagunas.Hectareas AS Libras
FROM
dbo.GenEstOri
INNER JOIN
dbo.GenLagunas
ON dbo.GenEstOri.IDLaguna = dbo.GenLagunas.IDLaguna
INNER JOIN
dbo.GenAcSec
ON dbo.GenLagunas.IDSector = dbo.GenAcSec.IDSector
INNER JOIN
dbo.GenSectores
ON dbo.GenLagunas.IDSector = dbo.GenSectores.IDSector AND
dbo.GenAcSec.IDSector = dbo.GenSectores.IDSector
WHERE
GenAcSec.IDUser = @IDUsuario
and GenLagunas.Eslaguna = @Eslaguna
and GenSectores.IDFinca = @IDFinca
go

Seria bueno que postearas la estructura de las tablas, incluyendo
restricciones e indices. Asi tendremos mas informacion para darte una
recomendacion.

Por ejemplo, si la tabla [GenSectores] tiene un indice nonclustered por la
columna [IDFinca], pudieras tener un parametro @IDFinca al cual le pases un
valor, si deseas buscar un IDFinca especifico, o le pases NULL si deseas
todas las filas. Claro esta, que si esa columna acepta valores NULL, entonces
no ganamos nada. Pudieras usar al asi como:

...
where
GenAcSec.IDUser = @IDUsuario
and GenLagunas.Eslaguna = @Eslaguna
and GenSectores.IDFinca between coalesce(@IDFinca, convert(int,
0x80000000)) and coalesce(@IDFinca, convert(int, 0x7FFFFFFF))

De esta manera, si pasas un valor en el parametro, SQL Server usara
correctamente el indice en caso de existir (tambien influira la selectividad
para ese valor).

Otra manera de afrontar estas busquedas dinamicas, es usando sql dinamico,
osea, contruyendo la sentencia en base a los valores de los parametros que se
pasen y ejecutando esa sentencia usando sp_executesql.

Ajunto dos links que apuntan a dos estupendos articulos sobre el tema. El
uno explica cuando y como usar SQL dinamico y otro nos da una serie de
recomendaciones para hacer busquedas dinamicas sin necesidad de usar SQL
dinamico y sin impartar negativamente el rendimineto de la consulta.

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

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

AMB


"Erik Martinez" wrote:

Agradezco mucho sus comentarios y recomendaciones.
se me ocurrio mejor presentarles los 2 procedimientos almacenados reales
para que vean las dif. y seguir leyendo sus recomendaciones.

1era forma (un solo select) "la que me parece mejor"

create PROCEDURE sp_ProdEstOri
@IDUsuario int,
@Filtro int,
@Valor int,
@Eslaguna int
AS
filtros

SELECT dbo.GenEstOri.Ciclo, dbo.GenLagunas.IDLaguna,
dbo.GenLagunas.Laguna, dbo.GenLagunas.Hectareas, dbo.GenEstOri.LagCiclo,
dbo.GenEstOri.FecSiembra, dbo.GenEstOri.Densidad,
dbo.GenEstOri.TipoSiembra, dbo.GenEstOri.FCA, dbo.GenEstOri.Diascult,
dbo.GenEstOri.FecSiembra + dbo.GenEstOri.Diascult AS
Fecose, dbo.GenEstOri.DiasSeca, dbo.GenEstOri.CrecSem,
dbo.GenEstOri.Diascult / 7 * dbo.GenEstOri.CrecSem AS
PesoCos, dbo.GenEstOri.PorSup,
dbo.GenEstOri.Densidad * dbo.GenEstOri.PorSup / 100
AS camcosm2, dbo.GenEstOri.PesoCola, ((dbo.GenEstOri.Densidad * 10000)
* (dbo.GenEstOri.PorSup / 100)) *
(dbo.GenEstOri.Diascult / 7 * dbo.GenEstOri.CrecSem) / 454 *
dbo.GenEstOri.PesoCola AS rendhas,
((dbo.GenEstOri.Densidad * 10000) *
(dbo.GenEstOri.PorSup / 100)) * (dbo.GenEstOri.Diascult / 7 *
dbo.GenEstOri.CrecSem)
/ 454 * dbo.GenEstOri.PesoCola *
dbo.GenLagunas.Hectareas AS Libras
FROM dbo.GenEstOri INNER JOIN
dbo.GenLagunas ON dbo.GenEstOri.IDLaguna =
dbo.GenLagunas.IDLaguna INNER JOIN
dbo.GenAcSec ON dbo.GenLagunas.IDSector =
dbo.GenAcSec.IDSector INNER JOIN
dbo.GenSectores ON dbo.GenLagunas.IDSector =
dbo.GenSectores.IDSector AND dbo.GenAcSec.IDSector =
dbo.GenSectores.IDSector
WHERE GenAcSec.IDUser=@IDUsuario and
GenLagunas.Eslaguna=@Eslaguna and
GenSectores.IDFinca=case when @Filtro=2 then @Valor else
GenSectores.IDFinca end and
GenLagunas.IDSector=case when @Filtro=3 then @Valor else
GenLagunas.IDSector end and
GenLagunas.IDLaguna=case when @Filtro=4 then @Valor else
GenLagunas.IDLaguna end
GO


2da forma(varios select)

CREATE PROCEDURE sp_ProdEstOri
@IDUsuario int,
@Filtro int,
@Valor int,
@Eslaguna int
AS
filtros
if @Filtro=1
begin
SELECT dbo.GenEstOri.Ciclo, dbo.GenLagunas.IDLaguna,
dbo.GenLagunas.Laguna, dbo.GenLagunas.Hectareas, dbo.GenEstOri.LagCiclo,
dbo.GenEstOri.FecSiembra, dbo.GenEstOri.Densidad,
dbo.GenEstOri.TipoSiembra, dbo.GenEstOri.FCA, dbo.GenEstOri.Diascult,
dbo.GenEstOri.FecSiembra + dbo.GenEstOri.Diascult AS
Fecose, dbo.GenEstOri.DiasSeca, dbo.GenEstOri.CrecSem,
dbo.GenEstOri.Diascult / 7 * dbo.GenEstOri.CrecSem AS
PesoCos, dbo.GenEstOri.PorSup,
dbo.GenEstOri.Densidad * dbo.GenEstOri.PorSup / 100
AS camcosm2, dbo.GenEstOri.PesoCola, ((dbo.GenEstOri.Densidad * 10000)
* (dbo.GenEstOri.PorSup / 100)) *
(dbo.GenEstOri.Diascult / 7 * dbo.GenEstOri.CrecSem) / 454 *
dbo.GenEstOri.PesoCola AS rendhas,
((dbo.GenEstOri.Densidad * 10000) *
(dbo.GenEstOri.PorSup / 100)) * (dbo.GenEstOri.Diascult / 7 *
dbo.GenEstOri.CrecSem)
/ 454 * dbo.GenEstOri.PesoCola *
dbo.GenLagunas.Hectareas AS Libras
FROM dbo.GenEstOri INNER JOIN
dbo.GenLagunas ON dbo.GenEstOri.IDLaguna =
dbo.GenLagunas.IDLaguna INNER JOIN
dbo.GenAcSec ON dbo.GenLagunas.IDSector =
dbo.GenAcSec.IDSector INNER JOIN
dbo.GenSectores ON dbo.GenLagunas.IDSector =
dbo.GenSectores.IDSector AND dbo.GenAcSec.IDSector =
dbo.GenSectores.IDSector
WHERE GenAcSec.IDUser=@IDUsuario and GenLagunas.Eslaguna=@Eslaguna
end
else
begin
if @Filtro=2
begin
SELECT dbo.GenEstOri.Ciclo, dbo.GenLagunas.IDLaguna,
dbo.GenLagunas.Laguna, dbo.GenLagunas.Hectareas, dbo.GenEstOri.LagCiclo,
dbo.GenEstOri.FecSiembra, dbo.GenEstOri.Densidad,
dbo.GenEstOri.TipoSiembra, dbo.GenEstOri.FCA, dbo.GenEstOri.Diascult,
dbo.GenEstOri.FecSiembra + dbo.GenEstOri.Diascult AS
Fecose, dbo.GenEstOri.DiasSeca, dbo.GenEstOri.CrecSem,
dbo.GenEstOri.Diascult / 7 * dbo.GenEstOri.CrecSem AS
PesoCos, dbo.GenEstOri.PorSup,
dbo.GenEstOri.Densidad * dbo.GenEstOri.PorSup / 100
AS camcosm2, dbo.GenEstOri.PesoCola, ((dbo.GenEstOri.Densidad * 10000)
* (dbo.GenEstOri.PorSup / 100)) *
(dbo.GenEstOri.Diascult / 7 * dbo.GenEstOri.CrecSem) / 454 *
dbo.GenEstOri.PesoCola AS rendhas,
((dbo.GenEstOri.Densidad * 10000) *
(dbo.GenEstOri.PorSup / 100)) * (dbo.GenEstOri.Diascult / 7 *
dbo.GenEstOri.CrecSem)
/ 454 * dbo.GenEstOri.PesoCola *
dbo.GenLagunas.Hectareas AS Libras
FROM dbo.GenEstOri INNER JOIN
dbo.GenLagunas ON dbo.GenEstOri.IDLaguna =
dbo.GenLagunas.IDLaguna INNER JOIN
dbo.GenAcSec ON dbo.GenLagunas.IDSector =
dbo.GenAcSec.IDSector INNER JOIN
dbo.GenSectores ON dbo.GenLagunas.IDSector =
dbo.GenSectores.IDSector AND dbo.GenAcSec.IDSector =
dbo.GenSectores.IDSector
WHERE GenAcSec.IDUser=@IDUsuario and GenLagunas.Eslaguna=@Eslaguna
and GenSectores.IDFinca=@Valor

end
else
begin
if @Filtro=3
begin
SELECT dbo.GenEstOri.Ciclo, dbo.GenLagunas.IDLaguna,
dbo.GenLagunas.Laguna, dbo.GenLagunas.Hectareas, dbo.GenEstOri.LagCiclo,
dbo.GenEstOri.FecSiembra, dbo.GenEstOri.Densidad,
dbo.GenEstOri.TipoSiembra, dbo.GenEstOri.FCA, dbo.GenEstOri.Diascult,
dbo.GenEstOri.FecSiembra + dbo.GenEstOri.Diascult AS
Fecose, dbo.GenEstOri.DiasSeca, dbo.GenEstOri.CrecSem,
dbo.GenEstOri.Diascult / 7 * dbo.GenEstOri.CrecSem
AS PesoCos, dbo.GenEstOri.PorSup,
dbo.GenEstOri.Densidad * dbo.GenEstOri.PorSup / 100
AS camcosm2, dbo.GenEstOri.PesoCola, ((dbo.GenEstOri.Densidad * 10000)
* (dbo.GenEstOri.PorSup / 100)) *
(dbo.GenEstOri.Diascult / 7 * dbo.GenEstOri.CrecSem) / 454 *
dbo.GenEstOri.PesoCola AS rendhas,
((dbo.GenEstOri.Densidad * 10000) *
(dbo.GenEstOri.PorSup / 100)) * (dbo.GenEstOri.Diascult / 7 *
dbo.GenEstOri.CrecSem)
/ 454 * dbo.GenEstOri.PesoCola *
dbo.GenLagunas.Hectareas AS Libras
FROM dbo.GenEstOri INNER JOIN
dbo.GenLagunas ON dbo.GenEstOri.IDLaguna =
dbo.GenLagunas.IDLaguna INNER JOIN
dbo.GenAcSec ON dbo.GenLagunas.IDSector =
dbo.GenAcSec.IDSector INNER JOIN
dbo.GenSectores ON dbo.GenLagunas.IDSector =
dbo.GenSectores.IDSector AND dbo.GenAcSec.IDSector =
dbo.GenSectores.IDSector
WHERE GenAcSec.IDUser=@IDUsuario and GenLagunas.Eslaguna=@Eslaguna
and GenLagunas.IDSector=@Valor

end
else
begin
SELECT dbo.GenEstOri.Ciclo, dbo.GenLagunas.IDLaguna,
dbo.GenLagunas.Laguna, dbo.GenLagunas.Hectareas, dbo.GenEstOri.LagCiclo,
dbo.GenEstOri.FecSiembra, dbo.GenEstOri.Densidad,
dbo.GenEstOri.TipoSiembra, dbo.GenEstOri.FCA, dbo.GenEstOri.Diascult,
dbo.GenEstOri.FecSiembra + dbo.GenEstOri.Diascult AS
Fecose, dbo.GenEstOri.DiasSeca, dbo.GenEstOri.CrecSem,
dbo.GenEstOri.Diascult / 7 * dbo.GenEstOri.CrecSem
AS PesoCos, dbo.GenEstOri.PorSup,
dbo.GenEstOri.Densidad * dbo.GenEstOri.PorSup / 100
AS camcosm2, dbo.GenEstOri.PesoCola, ((dbo.GenEstOri.Densidad * 10000)
* (dbo.GenEstOri.PorSup / 100)) *
(dbo.GenEstOri.Diascult / 7 * dbo.GenEstOri.CrecSem) / 454 *
dbo.GenEstOri.PesoCola AS rendhas,
((dbo.GenEstOri.Densidad * 10000) *
(dbo.GenEstOri.PorSup / 100)) * (dbo.GenEstOri.Diascult / 7 *
dbo.GenEstOri.CrecSem)
/ 454 * dbo.GenEstOri.PesoCola *
dbo.GenLagunas.Hectareas AS Libras
FROM dbo.GenEstOri INNER JOIN
dbo.GenLagunas ON dbo.GenEstOri.IDLaguna =
dbo.GenLagunas.IDLaguna INNER JOIN
dbo.GenAcSec ON dbo.GenLagunas.IDSector =
dbo.GenAcSec.IDSector INNER JOIN
dbo.GenSectores ON dbo.GenLagunas.IDSector =
dbo.GenSectores.IDSector AND dbo.GenAcSec.IDSector =
dbo.GenSectores.IDSector
WHERE GenAcSec.IDUser=@IDUsuario and GenLagunas.Eslaguna=@Eslaguna
and GenLagunas.IDLaguna=@Valor

end
end
end
GO




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