Hola... se me presentó una cosa parecida para un sp, y después de probar varias opciones, la más eficiente, aunque a primera vista no lo parezca, es hacer una select diferente dependiendo de los parámetros que recibas.
Vas comprobando que parámetros recibes y pones las selects necesarias
alter procedure.....
@cCodCliente varchar(6) = '0',
@cCodSector varchar(20) = '0',
@nCodPractica int = 0,
@nCodConsultor int = 0
AS
If (@cCodCliente = '0' OR @cCodCliente = '')
BEGIN /*NO HA INDICADO CLIENTE*/
IF (@nCodConsultor = 0 OR @nCodConsultor = -1)
BEGIN /*NO HA INDICADO CONSULTOR*/
IF (@nCodPractica = 0 OR @nCodPractica = -1)
BEGIN /*NO HA INDICADO PRACTICA*/
IF (@cCodSector = '0' OR @cCodSector = '-1')
BEGIN /* NO HA INDICADO SECTOR, SELECT SIN FILTROS */
SELECT Clientes.CodigoEtas, ISNULL(TabEstadoServicios.AbrevEstado, 'PO') AS Estado,
ISNULL(TabEstadoServicios.DescEstado, 'Posible') AS DescEstado,
ISNULL(ServiciosAsignados.IdServicio, 0) AS IdServicio, ServiciosAsignados.FechaEstado,
ISNULL(TabEstadoServicios.AbrevEstado, 'PO') AS DatoEscribir, Clientes.COMPANY, UTIPO, ConsultorResponsable
FROM (SELECT CONTACT1.KEY1 AS CodigoEtas, CONTACT1.Company, UTIPO,
UOWNER AS ConsultorResponsable
FROM dbo.CONTACT1 INNER JOIN dbo.CONTACT2
ON dbo.CONTACT1.ACCOUNTNO = dbo.CONTACT2.ACCOUNTNO
WHERE (dbo.CONTACT2.UTIPO LIKE '%Cliente' OR dbo.CONTACT2.UTIPO LIKE '%Prospect'))
Clientes LEFT JOIN
(viewServiciosAsignadosMostrar ServiciosAsignados INNER JOIN TabEstadoServicios
ON ServiciosAsignados.Estado = TabEstadoServicios.IdEstado)
ON Clientes.CodigoEtas = ServiciosAsignados.CodigoEtas
ORDER BY Clientes.COMPANY
END
ELSE
BEGIN /*SOLO FILTRAR POR SECTOR*/
SELECT Clientes.CodigoEtas, ISNULL(TabEstadoServicios.AbrevEstado, 'PO') AS Estado,
ISNULL(TabEstadoServicios.DescEstado, 'Posible') AS DescEstado,
ISNULL(ServiciosAsignados.IdServicio, 0) AS IdServicio, FechaEstado,
ISNULL(TabEstadoServicios.AbrevEstado, 'PO') AS DatoEscribir, Clientes.Company, UTIPO, ConsultorResponsable
FROM (SELECT CONTACT1.KEY1 AS CodigoEtas, CONTACT1.Company, UTIPO,
UOWNER AS ConsultorResponsable
FROM dbo.CONTACT1 INNER JOIN dbo.CONTACT2
ON dbo.CONTACT1.ACCOUNTNO = dbo.CONTACT2.ACCOUNTNO
WHERE (dbo.CONTACT2.UTIPO LIKE '%Cliente' OR dbo.CONTACT2.UTIPO LIKE '%Prospect')
AND (CONTACT2.USECTSIC = @cCodSector))
Clientes LEFT JOIN
(viewServiciosAsignadosMostrar ServiciosAsignados
INNER JOIN TabEstadoServicios
ON ServiciosAsignados.Estado = TabEstadoServicios.IdEstado)
ON Clientes.CodigoEtas = ServiciosAsignados.CodigoEtas
ORDER BY Clientes.Company
END.....
.....
.....
.....
poner los predeterminados hacen que los nulos vengan con el valor que tú le pones, pero, las cadenas vacías, no son nulos, así que tienes que comprobar el valor '', para los numéricos solo hace falta que compruebes el cero, en mi caso, el cero no es un valor válido.
Es tedioso de hacer, pero funciona bien, y es rápido.
Un saludo