私はテーブルに文字で区切られた文字列のリストを分割するには、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 desc like 'test1'やdesc 'test2''などのwhere節でそれらを一緒に文字列にするか、ループを使用してそれぞれに複数のselect文を連結する必要があります検索用語を使用し、 'select * from pl 'のような" union "を使用します。上記の最初のオプションはデータベースにとってはより効率的ですが、where句を正しく構築するには少しの作業が必要になります – soohoonigan