使用在TextBox中输入的多个关键字搜索SQL数据库

时间:2017-08-29 21:07:46

标签: sql vb.net

我有一个表单,其中一个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以显示给用户。

我非常感谢对此有任何帮助。

我已经搜索了解决方案,其中大部分都与其他语言有关,而我对它的了解甚少。

1 个答案:

答案 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查询。

相关问题