Šel bych s:
ALTER FUNCTION SearchProjects (
@location NVARCHAR(50),
@purpose NVARCHAR(50),
@type NVARCHAR(50))
RETURNS TABLE
AS
RETURN
(
SELECT p.ProjectName,
p.Areas,
p.PaymentSystem,
p.ReceivedDate,
p.PropertyClassification,
p.ProjectImage,
l.LocationName,
pur.PurposeName,
t.TypeName
FROM dbo.Projects AS p
LEFT JOIN dbo.Locations AS l ON p.LocationID = l.ID
LEFT JOIN dbo.Purposes pur ON p.PurposeID = pur.ID
LEFT JOIN dbo.[Types] AS t ON p.TypeID = t.ID
WHERE UPPER(ISNULL(l.LocationName,N'')) LIKE N'%' + UPPER(@location) + '%'
AND UPPER(ISNULL(pur.PurposeName,N'')) LIKE N'%' + UPPER(@purpose) + '%'
AND UPPER(ISNULL(t.TypeName,N'')) LIKE N'%' + UPPER(@type) + '%'
)
GO
pokud chcete vrátit pouze projekty, kde všechny kritéria jsou splněna a prázdný řetězec ve vstupním parametru je považován za zástupný znak:
SELECT * FROM dbo.SearchProjects('','',''); -- Returns all records
SELECT * FROM dbo.SearchProjects('north','',''); -- Returns all records with LocationName containing 'north'
SELECT * FROM dbo.SearchProjects('','research',''); -- Returns all records with PurposeName containing 'research'
SELECT * FROM dbo.SearchProjects('','','closed'); -- Returns all records with TypeName containing 'closed'
SELECT * FROM dbo.SearchProjects('north','research',''); -- Returns all records with LocationName containing 'north' and PurposeName containing 'research'
Tím se také odstraní jakékoli rozlišování velkých a malých písmen při porovnávání hodnot vstupních parametrů s hodnotami polí ve vašich tabulkách. Stále bych použil LEFT JOIN
namísto INNER JOIN
jen pro případ, že by některé záznamy projektu mohly mít chybné hodnoty LocationID, PurposeID nebo TypeID.
Pokud chcete vrátit projekty kamkoli jakékoli kritéria ze vstupních parametrů jsou splněna (a nepovažovat prázdné vstupní parametry za zástupné znaky, pokud alespoň jeden vstupní parametr obsahuje hodnotu), můžete změnit AND
s v WHERE
klauzule na OR
s a předejte NULL
pro všechny vstupní parametry, pro které nechcete zadávat hodnotu:
ALTER FUNCTION SearchProjects (
@location NVARCHAR(50),
@purpose NVARCHAR(50),
@type NVARCHAR(50))
RETURNS TABLE
AS
RETURN
(
SELECT p.ProjectName,
p.Areas,
p.PaymentSystem,
p.ReceivedDate,
p.PropertyClassification,
p.ProjectImage,
l.LocationName,
pur.PurposeName,
t.TypeName
FROM dbo.Projects AS p
LEFT JOIN dbo.Locations AS l ON p.LocationID = l.ID
LEFT JOIN dbo.Purposes pur ON p.PurposeID = pur.ID
LEFT JOIN dbo.[Types] AS t ON p.TypeID = t.ID
WHERE UPPER(ISNULL(l.LocationName,N'')) LIKE N'%' + UPPER(@location) + '%'
OR UPPER(ISNULL(pur.PurposeName,N'')) LIKE N'%' + UPPER(@purpose) + '%'
OR UPPER(ISNULL(t.TypeName,N'')) LIKE N'%' + UPPER(@type) + '%'
)
GO
SELECT * FROM dbo.SearchProjects('','',''); -- Returns all records
SELECT * FROM dbo.SearchProjects('north',NULL,NULL); -- Returns all records with LocationName containing 'north'
SELECT * FROM dbo.SearchProjects(NULL,'research',NULL); -- Returns all records with PurposeName containing 'research'
SELECT * FROM dbo.SearchProjects(NULL,NULL,'closed'); -- Returns all records with TypeName containing 'closed'
SELECT * FROM dbo.SearchProjects('north','research',NULL); -- Returns all records with LocationName containing 'north' or PurposeName containing 'research'
NULL
Zde je nutné zadávat nechtěné vstupní parametry, protože volání funkce s prázdným řetězcem v kterémkoli ze vstupních parametrů by vedlo k vrácení všech záznamů:
SELECT * FROM dbo.SearchProjects('north','','');
SELECT * FROM dbo.SearchProjects('north','research','');
SELECT * FROM dbo.SearchProjects('north','','closed');