I'm trying to make a stored procedure about a filtering search of certain tables. I'm passing the list values by parameters and adding it to temp tables.
My logic is failing and I would like to clarify if I'm in a good path. There are three filters "Services","Equipment" and "Zones" The user can select one or more filters and each filter can have one or more items.
My doubts start by how can I define if only one or two filters is being applied. How I can be certain that the condition is being applied correctly?
This is my query:
ALTER PROCEDURE [dbo].[SearchFilterProvider]
(@SearchService nvarchar(max)=NULL,@SearchEquipment nvarchar(max)=NULL, @SearchZone nvarchar(max)=NULL)
AS
BEGIN
    BEGIN TRAN
        BEGIN TRY
            CREATE TABLE #Services (TipoServicio nvarchar(35));
            INSERT INTO #Services (TipoServicio)
                SELECT VALUE FROM string_split(@SearchService,'|');
            CREATE TABLE #Equipments (TipoEquipo nvarchar(35));
            INSERT INTO #Equipments (TipoEquipo)
                SELECT VALUE FROM string_split(@SearchEquipment,'|');
                CREATE TABLE #Zones (NombreZona nvarchar(35));
            INSERT INTO #Zones (NombreZona)
                SELECT VALUE FROM string_split(@SearchZone,'|');
            
            SELECT P.RazonSocial as 'Razon Social Proveedor', P.TipoProveedor as Tipo,
            (
                SELECT STRING_AGG(Z.NombreZona,';')
                FROM Rel_ProvZona pZ
                INNER JOIN Zona Z on pZ.idZona= Z.idZona
                WHERE pZ.idProveedor=P.idProveedor
            )AS Zonas,
            P.Estatus,P.Ciudad,P.Estado,P.Pais,P.Comentarios,U.Nombre+' ' +U.Apellido AS Usuario
            FROM Proveedor P
            INNER JOIN Usuario U ON P.Despachador=U.idUsuario
            INNER JOIN Rel_ProvServicio pS ON P.idProveedor= pS.idProveedor
            INNER JOIN Servicio S ON pS.idServicio=S.idServicio
            INNER JOIN Rel_ProvEquipo pE ON P.idProveedor= pE.idProveedor
            INNER JOIN Equipo E ON pE.idEquipo=E.idEquipo
            INNER JOIN Rel_ProvZona pZ ON P.idProveedor= pZ.idProveedor
            INNER JOIN Zona Z ON pZ.idZona=Z.idZona
            WHERE  S.TipoServicio IN (SELECT TipoServicio FROM #Services) OR  Z.NombreZona IN (SELECT NombreZona FROM #Zones) OR E.TipoEquipo IN (SELECT TipoEquipo FROM #Equipments)
          GROUP BY P.idProveedor,P.RazonSocial,P.TipoProveedor, P.Estatus,P.Ciudad,P.Estado,P.Pais,P.Comentarios,(U.Nombre+' '+U.Apellido)
            COMMIT TRAN
        END TRY
        BEGIN CATCH
            IF @@TRANCOUNT>0
                BEGIN
                    ROLLBACK TRAN
                END
        END CATCH
END
Is not only check if parameters are NULL is to check if the conditions are well applied in the where clause, because if I make a consult:
EXEC SearchFilterProvider NULL, NULL 'Norte|Bajio'
+-----+---------------+----+
| RazonSocial | Zonas      | 
+-----+--------------------+ 
| R1          | Bajio      |
| R2          |Norte;Bajio |
+-----+---------------+----+
It no longer appears with duplicates and by the consult only R2 must appear because it match with the condition
