2017-05-26 83 views
0

当我插入一条评论时,如果他们是发誓的单词,我想替换句子中的元音。 我有一个发誓词的表。 (我现在只有2个表中的话,但会有更多的稍后添加)SQL替换函数不起作用

我有一个表BADWORDS这样的:

Word 
---------- 
Luke 
father 
---------- 

现在,当我插入“卢克,我是你爸爸”我希望它返回'Lk-,我是你的F-th-r'

这就是我所得到的。但它不能取代任何东西。

CREATE TRIGGER replace_badWords ON comment 
INSTEAD OF INSERT 
AS 
DECLARE @word AS NVARCHAR(50); 
DECLARE @wordCursor AS CURSOR; 
DECLARE @text VARCHAR(500) = (SELECT I.messageText FROM inserted I) 

SET @wordCursor = CURSOR FOR 
SELECT word FROM Badwords; 
OPEN @wordCursor; 
FETCH NEXT FROM @wordCursor INTO @word; 
WHILE @@FETCH_STATUS = 0 
BEGIN 
SET @text=REPLACE(@text,@word,REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@word,'A','-'),'E','-'),'I','-'),'O','-'),'U','-')) 
FETCH NEXT FROM @wordCursor INTO @word; 
END; 
INSERT INTO Comment(messageText) values(@text) 
CLOSE @wordCursor; 
DEALLOCATE @wordCursor; 

输出:卢克,我是你爸爸

我所要的输出是这样的:LK-,我是你的第f-R

有谁知道如何解决这个问题??

+3

你确定要这么做*永久*数据库里面?如果在6个月内添加新的不良词,会发生什么情况?您必须重新处理所有数据。如果情感在一年内变化而“父亲”变得可以接受会发生什么?你必须撤消你的损坏表格(更糟糕的是,如果某人真的进入了并且意味着“f-th-r” - 你实际上改变了他们的原创)。我强烈建议存储用户提供的实际文本,并且仅在演示时执行此替换 - 使用*当前*一组“坏词” –

+2

(此外,您的触发器由于其他原因而被打破 - “插入”可以包含0,1或**多个**行) –

+1

您也不会从字符串中解析单词。当“蛤蜊”调皮时,“Rodger的声明是衷心的”会发生什么?您想如何处理重叠的单词,例如如果“lug”和“beluga”都是冒犯性的? – HABO

回答

0

您可以在包含单词的表上进行更新,并通过替换表中所有单词的元音来设置实际字符串。

DECLARE @String VARCHAR(100) = 'Luke, I am your father' 

DECLARE @AbusiveWords TABLE(ID INT,Word VARCHAR(10)) 
INSERT INTO @AbusiveWords (ID,Word) values (1,'Luke'),(2,'father') 

UPDATE @AbusiveWords 
SET @String=REPLACE(@String,Word,REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(Word,'A','-'),'E','-'),'I','-'),'O','-'),'U','-')) 
PRINT(@string); 

输出:

L-k- , I am your f-th-r 
+0

这适用于提供的示例数据,但也将替换其他实例。考虑一下HABO在上面提出的白鲸和耳朵的例子。将(3,'lug')添加到桌子上,并将上面的字符串更改为“Luke,我是你的父亲是白鲸”。它会改变白鲸,尽管这不在坏词的列表中。 –