我有一个表单,其中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
用于显示给用户。
我将不胜感激。
我已经搜索了解决方案,其中大部分与其他语言有关,我对此知之甚少。
我首先在 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 查询。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句