SP repetitivo

29/09/2004 - 13:23 por Marcos | Informe spam
El tema es que le puedo pasar solo una de tres posibles fechas o ninguna,
pero no se como hacer para no tener que escribir (como lo hice abajo) tres
veces dependiendo del campo fecha.
Si alguien me da una mano se lo agradezco.

Bye =)


CREATE PROCEDURE s_Get_PO
(
@po_po varchar(20)=null,
@cus_Name varchar(100)=null,
@for_Name varchar(50)=null,
@inc_Name varchar(50)=null,
@kin_Name varchar(20)=null,
@po_Close char(1)=null,
@po_So varchar(50)=null,
@po_Urgent char(1)=null,
@reg_Name varchar(50)=null,
@CampoFecha varchar(10)=null,
@fDesde datetime=null,
@fHasta datetime=null
)
AS
IF @CampoFecha IS NULL
BEGIN
SELECT * FROM v_PO WHERE
po_po=isnull(@po_po,po_po) AND cus_Name=isnull(@cus_Name,cus_Name) AND
for_Name =isnull(@for_Name,for_Name) AND
inc_Name=isnull(@inc_Name,inc_Name) AND
kin_Name=isnull(@kin_Name,kin_Name) AND po_Close
=isnull(@po_Close,po_Close) AND
( @po_So=po_So or @po_so is null) AND
po_Urgent=isnull(@po_Urgent,po_Urgent) AND
reg_Name=isnull( @reg_Name, reg_Name)
ORDER BY PO_PO
END
IF @CampoFecha='po_DatePO' and @CampoFecha IS NOT NULL
BEGIN
SELECT * FROM v_PO WHERE
po_po=isnull(@po_po,po_po) AND cus_Name=isnull(@cus_Name,cus_Name) AND
for_Name =isnull(@for_Name,for_Name) AND
inc_Name=isnull(@inc_Name,inc_Name) AND
kin_Name=isnull(@kin_Name,kin_Name) AND po_Close
=isnull(@po_Close,po_Close) AND
( @po_So=po_So or @po_so is null) AND
po_Urgent=isnull(@po_Urgent,po_Urgent) AND
reg_Name=isnull( @reg_Name, reg_Name) AND
po_DatePO >= @fDesde and po_DatePO < @fHasta
ORDER BY PO_PO
END
IF @CampoFecha='po_DateSO' and @CampoFecha IS NOT NULL
BEGIN
SELECT * FROM v_PO WHERE
po_po=isnull(@po_po,po_po) AND cus_Name=isnull(@cus_Name,cus_Name) AND
for_Name =isnull(@for_Name,for_Name) AND
inc_Name=isnull(@inc_Name,inc_Name) AND
kin_Name=isnull(@kin_Name,kin_Name) AND po_Close
=isnull(@po_Close,po_Close) AND
( @po_So=po_So or @po_so is null) AND
po_Urgent=isnull(@po_Urgent,po_Urgent) AND
reg_Name=isnull( @reg_Name, reg_Name) AND
po_DateSO >= @fDesde and po_DateSO < @fHasta
ORDER BY PO_PO
END
IF @CampoFecha='po_ETD' and @CampoFecha IS NOT NULL
BEGIN
SELECT * FROM v_PO WHERE
po_po=isnull(@po_po,po_po) AND cus_Name=isnull(@cus_Name,cus_Name) AND
for_Name =isnull(@for_Name,for_Name) AND
inc_Name=isnull(@inc_Name,inc_Name) AND
kin_Name=isnull(@kin_Name,kin_Name) AND po_Close
=isnull(@po_Close,po_Close) AND
( @po_So=po_So or @po_so is null) AND
po_Urgent=isnull(@po_Urgent,po_Urgent) AND
reg_Name=isnull( @reg_Name, reg_Name) AND
po_ETD >= @fDesde and po_ETD < @fHasta
ORDER BY PO_PO
END
 

Leer las respuestas

#1 Javier Loria
29/09/2004 - 14:27 | Informe spam
Hola:
Puede reescribirse como:
=CREATE PROCEDURE s_Get_PO(
@po_po varchar(20)=null,
@cus_Name varchar(100)=null,
@for_Name varchar(50)=null,
@inc_Name varchar(50)=null,
@kin_Name varchar(20)=null,
@po_Close char(1)=null,
@po_So varchar(50)=null,
@po_Urgent char(1)=null,
@reg_Name varchar(50)=null,
@CampoFecha varchar(10)=null,
@fDesde datetime=null,
@fHasta datetime=null
)
AS
SELECT *
FROM v_PO
WHERE po_po=COALESCE(@po_po,po_po)
AND cus_Name=COALESCE(@cus_Name,cus_Name)
AND for_Name=COALESCE(@for_Name,for_Name)
AND inc_Name=COALESCE(@inc_Name,inc_Name)
AND kin_Name=COALESCE(@kin_Name,kin_Name)
AND po_Close=iCOALESCE(@po_Close,po_Close)
AND (@po_So=po_So or @po_so is null)
AND po_Urgent=COALESCE(@po_Urgent,po_Urgent)
AND reg_Name=COALESCE( @reg_Name, reg_Name)
AND CASE
WHEN @CampoFecha IS NULL THEN 1
WHEN (@CampoFecha='po_DatePO')
AND (po_DatePO BETWEEN @fDesde AND @fHasta) THEN 1
WHEN (@CampoFecha='po_ETD')
AND (po_ETD BETWEEN @fDesde AND @fHasta) THEN 1
ELSE 0 END=1
= Claro que los planes de acceso no son muy buenos y casi siempre hara un
table scan (no usara indices). Algunos comentarios adicionales:
a) Trata de no usar * para seleccionar las columnas en consultas de
produccion, es mejor usar la lista de las columnas, sobre todo si luego
cambian las tablas.
b) Es mejor usar BETWEEN que > AND <, usan los indices y es menos
propenso a errores.
c) Es mejor usar COALESCE() que es ISNULL, porque es estandar y mas
extendible y no se presta para confusiones con el IS NULL
d) Seria mejor evitar el uso de nullos y usar algun tipo de valor
default, para evitar los ISNULL/COALESCE que no permitan usar indices.
Saludos,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda

"Marcos" wrote in message
news:
El tema es que le puedo pasar solo una de tres posibles fechas o ninguna,
pero no se como hacer para no tener que escribir (como lo hice abajo) tres
veces dependiendo del campo fecha.
Si alguien me da una mano se lo agradezco.

Bye =)


CREATE PROCEDURE s_Get_PO
(
@po_po varchar(20)=null,
@cus_Name varchar(100)=null,
@for_Name varchar(50)=null,
@inc_Name varchar(50)=null,
@kin_Name varchar(20)=null,
@po_Close char(1)=null,
@po_So varchar(50)=null,
@po_Urgent char(1)=null,
@reg_Name varchar(50)=null,
@CampoFecha varchar(10)=null,
@fDesde datetime=null,
@fHasta datetime=null
)
AS
IF @CampoFecha IS NULL
BEGIN
SELECT * FROM v_PO WHERE
po_po=isnull(@po_po,po_po) AND cus_Name=isnull(@cus_Name,cus_Name)


AND
for_Name =isnull(@for_Name,for_Name) AND
inc_Name=isnull(@inc_Name,inc_Name) AND
kin_Name=isnull(@kin_Name,kin_Name) AND po_Close
=isnull(@po_Close,po_Close) AND
( @po_So=po_So or @po_so is null) AND
po_Urgent=isnull(@po_Urgent,po_Urgent) AND
reg_Name=isnull( @reg_Name, reg_Name)
ORDER BY PO_PO
END
IF @CampoFecha='po_DatePO' and @CampoFecha IS NOT NULL
BEGIN
SELECT * FROM v_PO WHERE
po_po=isnull(@po_po,po_po) AND cus_Name=isnull(@cus_Name,cus_Name)


AND
for_Name =isnull(@for_Name,for_Name) AND
inc_Name=isnull(@inc_Name,inc_Name) AND
kin_Name=isnull(@kin_Name,kin_Name) AND po_Close
=isnull(@po_Close,po_Close) AND
( @po_So=po_So or @po_so is null) AND
po_Urgent=isnull(@po_Urgent,po_Urgent) AND
reg_Name=isnull( @reg_Name, reg_Name) AND
po_DatePO >= @fDesde and po_DatePO < @fHasta
ORDER BY PO_PO
END
IF @CampoFecha='po_DateSO' and @CampoFecha IS NOT NULL
BEGIN
SELECT * FROM v_PO WHERE
po_po=isnull(@po_po,po_po) AND cus_Name=isnull(@cus_Name,cus_Name)


AND
for_Name =isnull(@for_Name,for_Name) AND
inc_Name=isnull(@inc_Name,inc_Name) AND
kin_Name=isnull(@kin_Name,kin_Name) AND po_Close
=isnull(@po_Close,po_Close) AND
( @po_So=po_So or @po_so is null) AND
po_Urgent=isnull(@po_Urgent,po_Urgent) AND
reg_Name=isnull( @reg_Name, reg_Name) AND
po_DateSO >= @fDesde and po_DateSO < @fHasta
ORDER BY PO_PO
END
IF @CampoFecha='po_ETD' and @CampoFecha IS NOT NULL
BEGIN
SELECT * FROM v_PO WHERE
po_po=isnull(@po_po,po_po) AND cus_Name=isnull(@cus_Name,cus_Name)


AND
for_Name =isnull(@for_Name,for_Name) AND
inc_Name=isnull(@inc_Name,inc_Name) AND
kin_Name=isnull(@kin_Name,kin_Name) AND po_Close
=isnull(@po_Close,po_Close) AND
( @po_So=po_So or @po_so is null) AND
po_Urgent=isnull(@po_Urgent,po_Urgent) AND
reg_Name=isnull( @reg_Name, reg_Name) AND
po_ETD >= @fDesde and po_ETD < @fHasta
ORDER BY PO_PO
END


Preguntas similares