Sql server 在查询文本参数中搜索术语
我在SQL Server中有一个简单的表(我使用的是2008 R2): 假设我有以下数据:Sql server 在查询文本参数中搜索术语,sql-server,tsql,search,sql-server-2008-r2,Sql Server,Tsql,Search,Sql Server 2008 R2,我在SQL Server中有一个简单的表(我使用的是2008 R2): 假设我有以下数据: ----------------------------------------- - SiteId - Name - ----------------------------------------- - 1 - Foo Bar Baz - - 2 - Qux Tar
-----------------------------------------
- SiteId - Name -
-----------------------------------------
- 1 - Foo Bar Baz -
- 2 - Qux Tar -
- 3 - Contoso -
-----------------------------------------
我想允许用户搜索“baz foo
”并返回第1行。我希望SQLServer将一个输入字符串拆分,只返回列值与所有条件匹配的行
从逻辑上讲,这应该是这样的:
function Search(query) {
query = query.Split(" ");
sql = "SELECT ..."
foreach(term in query) {
sql += "WHERE Name LIKE " + term + " AND ";
}
executeSql( sql );
}
我知道T-SQL使使用数组变得非常困难,但肯定有一些内置的结构可以执行标记化/术语匹配?好吧,要在数据库中找到任何值,请看这里:它包括一个可以使用的脚本 创建自定义函数以生成SELECT语句
CREATE FUNCTION [dbo].[FINDWORDS](@SEARCHTERMS VARCHAR(150), @TABLE VARCHAR(100))
RETURNS VARCHAR(200)
AS
BEGIN
DECLARE @CURRENTCOUNT AS INT
DECLARE @MAXCOUNT AS INT
DECLARE @SEARCHSTATEMENT AS VARCHAR(200)
DECLARE @CURRENTITEM AS VARCHAR(50)
DECLARE @WORDS TABLE (ROWNUMBER INT, ITEMS VARCHAR(50))
INSERT INTO @WORDS(ROWNUMBER, ITEMS)
SELECT ROWNUMBER = ROW_NUMBER() OVER(ORDER BY items), items
FROM dbo.splitfn(@SEARCHTERMS, ' ')
SET @CURRENTCOUNT = 1
SET @MAXCOUNT = (SELECT MAX(ROWNUMBER) FROM @WORDS)
SET @SEARCHSTATEMENT = 'SELECT SiteId, Name
INTO #MYTABLE
FROM ' + @TABLE + ' WHERE Name LIKE ''%'
WHILE(@CURRENTCOUNT <= @MAXCOUNT)
BEGIN
IF @CURRENTCOUNT > 1
BEGIN
SET @SEARCHSTATEMENT = @SEARCHSTATEMENT + ' AND NAME LIKE ''%'
END
SET @CURRENTITEM = (SELECT items
FROM @WORDS
WHERE ROWNUMBER = @CURRENTCOUNT)
SET @SEARCHSTATEMENT = @SEARCHSTATEMENT + @CURRENTITEM + '%'''
SET @CURRENTCOUNT = @CURRENTCOUNT + 1
END
RETURN @SEARCHSTATEMENT
END
现在可以使用以下过程搜索特定字符串了
EXEC FINDWORDS2 @SEARCHSTRING = 'baz foo'
T-SQL使使用数组变得非常困难
但它可以使用表,并且自SQL Server 2008以来,您可以从客户端传递表。我的客户端是一个使用ADO的VBScript。这增加了难度:)您的sql语句也是动态的,或者您只想拆分一个字符串并查找每个值的存在?我希望这样做而不必求助于动态sql。
CREATE PROCEDURE [dbo].[FINDWORDS2] @SEARCHSTRING VARCHAR(200)
AS
BEGIN
DECLARE @STRING AS VARCHAR(200)
SET @STRING = DBO.FINDWORDS(@SEARCHSTRING, 'SITES') + ' SELECT * FROM #MYTABLE'
EXEC(@STRING)
END
EXEC FINDWORDS2 @SEARCHSTRING = 'baz foo'