2017-08-29 59 views
0

我有一個表格,其中一個TextBox用於由用戶輸入的搜索條件,並將結果顯示在ListBox中。使用在TextBox中輸入的多個關鍵字搜索SQL數據庫

我知道有可能採用所有搜索詞並使用這些詞執行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

我想你將需要一個更復雜的查詢來測試每個術語。 – Plutonix

+0

你必須拆分並循環搜索條件,並將它們串在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

回答

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查詢。

相關問題