わかりました。とりわけ、特定のキーワードを 5 つの列で検索するストアド プロシージャを作成しました。これを実現するために、関数によって分割され、テーブルとして返されるキーワード パラメーターを用意しました。次に、LIKE 制約を使用して、そのテーブルで左結合を実行します。
それで、私はこれがうまく機能していましたが、突然機能しなくなりました。必要な行だけではなく、すべての行が返されるようになりました。
もう 1 つの注意点は、キーワード パラメータが空の場合は無視する必要があるということです。
以下の内容を考えると、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