我希望有一个可以传递文本字符串的SQL过程,它会从关键字表中识别文本中的特定关键字(标签)。
到目前为止,我有以下内容可以很好地用于单个单词;
INSERT INTO #tags SELECT Word
FROM dbo.SplitWords('some colours are blue, green, red and light blue')
SELECT Word
FROM #tags
INTERSECT
SELECT Tag
FROM dbo.Tags
DROP TABLE #tags
如果我的代码表中包含“绿色”,“红色”和“蓝色”条目,则会按照您的预期返回它们。
我想知道的是我如何才能获得类似的结果,但对于多个单词的标签...例如,'浅蓝色'
我意识到我对上面代码的问题是我将源文本分成单个单词,所以'浅蓝'永远不会匹配,但是我可以采用不同的路径,不会调用游标等吗? / p>
感谢您的帮助
刚刚意识到以下内容将实现我的需求
DECLARE @Text as nvarchar(max)
SELECT @Text = 'some colours are blue, green, red and light blue'
SELECT TagID,
Tag
FROM Tags
WHERE @Text LIKE '% ' + Tag + ' %'
ORDER BY Tag
但是我担心如果我的表有几千行并且我正在搜索的文本字符串很长,那么效率可能会很低。
任何人都对如何更有效地完成同样的过程有任何想法?
答案 0 :(得分:0)
在TSQL - A join using full-text CONTAINS
上查看我的答案它利用了@Conrad的想法,但让你超越了CONTAINS的变量限制
答案 1 :(得分:0)
好的,我已经解决了以前的解决方案,直到我有时间重新思考/等待它成为一个问题。 旧方法现在花费太长时间来执行,迫使我找到替代解决方案。
在玩了一些我发现的最佳解决方案后(就执行时间而言)是光标....
因此,我设置了一个光标,用于搜索文本的短语和闪电通过它填充临时表,其中包含与我一致的短语ID。 使用FAST_FORWARD和FORWARD_ONLY设置来最大化性能的关键是。
完成后,我只需将临时表连接回我的数据库表,即可返回我需要的短语的详细信息。
以下示例代码:
DECLARE @PageText nvarchar(max) - 页面文本的参数
CREATE TABLE #Matches(PhraseID int)
DECLARE @PhraseID int DECLARE @PhraseText nvarchar(100)
DECLARE curMatchingPhrases CURSOR FAST_FORWARD FORWARD_ONLY FOR SELECT p.PhraseID, p.PhraseText 来自短语p
OPEN curMatchingPhrases
FETCH NEXT FROM curMatchingPhrases INTO @PhraseID,@ PhraseText
WHILE @@ FETCH_STATUS = 0 BEGIN
IF EXISTS (SELECT 'match' WHERE @PageText LIKE '% ' + @PhraseText + ' %')
BEGIN
INSERT #Matches SELECT @PhraseID
WHERE @PhraseID NOT IN (SELECT PhraseID FROM #Matches)
END
FETCH NEXT FROM curMatchingPhrases INTO @PhraseID, @PhraseText
END
关闭curMatchingPhrases DEALLOCATE curMatchingPhrases
SELECT * FROM #Matches
DROP TABLE #Matches
我相信这里的其他人将能够找到更优雅的解决方案,但光标已经为我减少了6 +秒SP降至0 - 1秒,所以我现在很高兴。
魔