我會通過SQL服務器上創建一個函數,字符分隔的字符串列表分成表開始:
CREATE Function [dbo].[StringListToNVarcharTable]
(@List nvarchar(MAX), @Splitter char(1))
RETURNS @tbl TABLE ([value] nvarchar(MAX) NOT NULL) AS
BEGIN
IF @Splitter IS NULL
SET @Splitter = ','
DECLARE @pos int,
@nextpos int,
@valuelen int
SELECT @pos = 0, @nextpos = 1
WHILE @nextpos > 0
BEGIN
SELECT @nextpos = charindex(@Splitter, @list, @pos + 1)
SELECT @valuelen = CASE WHEN @nextpos > 0
THEN @nextpos
ELSE len(@list) + 1
END - @pos - 1
INSERT @tbl ([value])
VALUES (convert(nvarchar(MAX), substring(@list, @pos + 1, @valuelen)))
SELECT @pos = @nextpos
END
RETURN
END
GO
進一步移動的,一旦你有這種功能,它成爲一件輕而易舉的創建一個存儲過程可以使用此功能爲您執行搜索 - 我個人更喜歡用管道分隔的字符串,但是您可以選擇您喜歡的內容。
CREATE PROCEDURE GetPartDescription
@PipeDelimitedSearchString VARCHAR(MAX)
AS
BEGIN
DECLARE @TblSearchStrings TABLE ([value] NVARCHAR(MAX) NOT NULL)
IF (@PipeDelimitedSearchString IS NOT NULL AND LEN(@PipeDelimitedSearchString) > 0)
BEGIN
INSERT INTO @TblSearchStrings ([value])
SELECT [value]
FROM StringListToNVarcharTable(@PipeDelimitedSearchString, '|')
END
SELECT
pl.PartId,
pl.PartName,
pl.PartDescription
FROM PartsList pl
INNER JOIN @TblSearchStrings ts ON pl.[Description] LIKE ('%' + ts.[value] + '%')
GROUP BY
pl.PartId,
pl.PartName,
pl.PartDescription
ORDER BY
pl.PartId,
pl.PartName,
pl.PartDescription
END
現在剩下的就是從代碼中調用存儲過程。 請注意,我沒有測試這個代碼,但你得到它的要點。你有一個可重用的函數和一個可重用的sp,並且你已經擺脫了代碼中硬編碼的SQL查詢。
我想你將需要一個更復雜的查詢來測試每個術語。 – Plutonix
你必須拆分並循環搜索條件,並將它們串在where子句中,比如'where desc like'test1''或desc'test2''等等......或者使用循環連接多個select語句搜索詞並使用「union」,如'select * from pl where desc like'test1'union select * from pl where desc like'test2''。提到的第一個選項對數據庫更高效,但需要一點工作才能正確構建where子句 – soohoonigan