我有一个表单,其中一个TextBox
用于用户输入的搜索字词,并以ListBox
显示结果。
我知道可以使用所有搜索字词并使用这些字词执行SQL
搜索,而不管输入的顺序如何。
我只是不确定分割单词并将它们作为单独的搜索词传递给SELECT命令的正确语法。
我目前的情况如下:
If txtDescription.Text <> "" Then
SQL.AddParam("@Description", "%" & txtDescription.Text & "%")
SQL.ExecQuery("SELECT Description FROM PartsList WHERE Description LIKE @Description ORDER BY ID ASC;")
For Each x As DataRow In SQL.DBDT.Rows
lbPartsList.Items.Add(x("Description"))
Next
End If
FOR语句处理每一行并将它们添加到ListBox
以显示给用户。
我非常感谢对此有任何帮助。
我已经搜索了解决方案,其中大部分都与其他语言有关,而我对它的了解甚少。
答案 0 :(得分:0)
我首先在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查询。