2014-10-27 55 views
1

我正在编写一个过程,以便自动覆盖用户在表单上输入的亵渎单词,并在有问题的单词位于查找数据库中时用星号代替文本。SQL确定查找表中是否列出了nvarchar变量中的单词

为了这个例子的缘故,我们假设Flubber在我们的Profanity表中是一个粗鲁的词,当它作为一个单词输入时,我们需要标记它。 'Flubber'需要被标记为不合适的,'Flubbermost'没问题。

用户输入:我真的很喜欢看Flubber。

我最终想要做的是更新字段中的数据:我真的很喜欢看*******。或者是一些变化,也许是F **** r。

我使用CONTAINS(我只是想确定我们是否在这个阶段有亵渎字)

DECLARE @String NVARCHAR(4000) 
SET @String = N'I really like watching Flubber' 
SELECT MyWord FROM MyLookup WHERE CONTAINS(MyWord,@String) 

尝试,但我得到以下信息

消息7630 ,Level 15,State 3,Line 4
全文搜索条件'真的'附近的语法错误'我真的很喜欢看Flubber'。

任何帮助将受到感谢。

编辑:

在从AHiggins我添加了一个全文索引和下面的代码帮助工作得很好:

DECLARE @String NVARCHAR(4000) 
DECLARE @MatchedWord NVARCHAR(100) 
DECLARE @ReturnString NVARCHAR(4000) 
SET varString = 'i really like watching Flubber' 
SELECT varMatchedWord = MyWord FROM MyLookup WHERE FREETEXT (DESCR,@String) 
PRINT CONVERT(VARCHAR(4000),@MatchedWord) 

而当整个单词找到该返回数据 - 完美。

关于我的问题的第二部分:请用'*******'代替'Flubber'这个词的最佳方式是什么?

回答

2

鉴于您的新要求,我实际上会指向您指向this answer,这表明(强烈)您使用SQL Server中的全文搜索功能。如果这是不可用的,不过,你可以这样做你自己的性能并使用下面的代码:样本数据

SELECT MyWord, @String AS SearchPhrase 
FROM MyLookup 
WHERE '.' + @String + '.' LIKE '%[^a-z]'+MyWord+'[^a-z]%' 

完整的示例:

DECLARE @MyLookup TABLE (MyWord VARCHAR(20)) 
INSERT INTO @MyLookup (MyWord) VALUES ('Flubber') 

DECLARE @String nVARCHAR(4000) 


SET @String = N'I really like watching Flubbers' 
SELECT MyWord, @String AS SearchPhrase FROM @MyLookup WHERE '.' + @String + '.' LIKE '%[^a-z]'+MyWord+'[^a-z]%' 

SET @String = N'I really like watching Flubber.' 
SELECT MyWord, @String AS SearchPhrase FROM @MyLookup WHERE '.' + @String + '.' LIKE '%[^a-z]'+MyWord+'[^a-z]%' 

SET @String = N'I really like watching Flubber, is that weird?' 
SELECT MyWord, @String AS SearchPhrase FROM @MyLookup WHERE '.' + @String + '.' LIKE '%[^a-z]'+MyWord+'[^a-z]%' 

SET @String = N'I really like watching the Flubber movie' 
SELECT MyWord, @String AS SearchPhrase FROM @MyLookup WHERE '.' + @String + '.' LIKE '%[^a-z]'+MyWord+'[^a-z]%' 

SET @String = N'I really like watching Flubber!' 
SELECT MyWord, @String AS SearchPhrase FROM @MyLookup WHERE '.' + @String + '.' LIKE '%[^a-z]'+MyWord+'[^a-z]%' 

SET @String = N'I really like watchingFlubber' 
SELECT MyWord, @String AS SearchPhrase FROM @MyLookup WHERE '.' + @String + '.' LIKE '%[^a-z]'+MyWord+'[^a-z]%' 

编辑:谈一个移动的目标...我已经从你的评论中采用了代码(使用全文搜索)并打印出了一个返回字符串,用星号代替了这个词。

请注意,如果该单词在同一个搜索字符串中显示多次,则会替换所有实例。我无法访问启用全文搜索的实例,因此您必须确认此操作符合预期。

DECLARE @String NVARCHAR(4000) 
DECLARE @MatchedWord NVARCHAR(100) 
DECLARE @ReturnString NVARCHAR(4000) 
SET @String = 'i really like watching Flubber' 

SELECT 
    @MatchedWord = MyWord, 
    @ReturnString = REPLACE(@String, MyWord, REPLICATE('*', LEN(MyWord))) 
FROM MyLookup 
WHERE FREETEXT (DESCR,@String) 

PRINT CONVERT(VARCHAR(4000), @MatchedWord) 
PRINT CONVERT(VARCHAR(4000), @ReturnString) 
+0

不错的一个AHiggins,谢谢。接下来我需要检查,我忘了添加到OP - 我会更新。如果这个词是独立发现的话。例如,String = N'Flubbermost'可以,String = N'Flubber'不好,需要标记。 – ROTB54 2014-10-27 16:46:47

+0

因此,您的条件已经扩展:您现在需要知道它是否是单独的单词(空格,标点符号或之后的字符串末尾)。那是对的吗? – AHiggins 2014-10-27 17:00:45

+0

对不起AlHiggins,是的,这是正确的。 – ROTB54 2014-10-28 07:46:09

相关问题