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