好的,我创建了一个存储过程,除其他外,它正在为特定关键字搜索 5 列。为此,我将关键字参数由函数拆分并作为表返回。然后我使用 LIKE 约束对该表进行左连接。
所以,我让这个工作得很好,然后突然停止工作。现在它返回每一行,而不仅仅是它需要的行。
另一个警告是,如果关键字参数为空,则应忽略它。
鉴于以下内容,是否存在 A) 明显错误,或 B) 解决此问题的更有效方法?
这是我目前拥有的:
ALTER PROCEDURE [dbo].[usp_getOppsPaged]
@startRowIndex int,
@maximumRows int,
@city varchar(100) = NULL,
@state char(2) = NULL,
@zip varchar(10) = NULL,
@classification varchar(15) = NULL,
@startDateMin date = NULL,
@startDateMax date = NULL,
@endDateMin date = NULL,
@endDateMax date = NULL,
@keywords varchar(400) = NULL
AS
BEGIN
SET NOCOUNT ON;
;WITH Results_CTE AS
(
SELECT opportunities.*,
organizations.*,
departments.dept_name,
departments.dept_address,
departments.dept_building_name,
departments.dept_suite_num,
departments.dept_city,
departments.dept_state,
departments.dept_zip,
departments.dept_international_address,
departments.dept_phone,
departments.dept_website,
departments.dept_gen_list,
ROW_NUMBER() OVER (ORDER BY opp_id) AS RowNum
FROM opportunities
JOIN departments ON opportunities.dept_id = departments.dept_id
JOIN organizations ON departments.org_id=organizations.org_id
LEFT JOIN Split(',',@keywords) AS kw ON
(title LIKE '%'+kw.s+'%' OR
[description] LIKE '%'+kw.s+'%' OR
tasks LIKE '%'+kw.s+'%' OR
requirements LIKE '%'+kw.s+'%' OR
comments LIKE '%'+kw.s+'%')
WHERE
(
(@city IS NOT NULL AND (city LIKE '%'+@city+'%' OR dept_city LIKE '%'+@city+'%' OR org_city LIKE '%'+@city+'%'))
OR
(@state IS NOT NULL AND ([state] = @state OR dept_state = @state OR org_state = @state))
OR
(@zip IS NOT NULL AND (zip = @zip OR dept_zip = @zip OR org_zip = @zip))
OR
(@classification IS NOT NULL AND (classification LIKE '%'+@classification+'%'))
OR
((@startDateMin IS NOT NULL AND @startDateMax IS NOT NULL) AND ([start_date] BETWEEN @startDateMin AND @startDateMax))
OR
((@endDateMin IS NOT NULL AND @endDateMax IS NOT NULL) AND ([end_date] BETWEEN @endDateMin AND @endDateMax))
OR
(
(@city IS NULL AND
@state IS NULL AND
@zip IS NULL AND
@classification IS NULL AND
@startDateMin IS NULL AND
@startDateMax IS NULL AND
@endDateMin IS NULL AND
@endDateMin IS NULL)
)
)
)
SELECT *
FROM Results_CTE
WHERE RowNum >= @startRowIndex
AND RowNum < @startRowIndex + @maximumRows;
END