如何从另一个表中嵌套替换值?

时间:2017-08-21 14:57:11

标签: sql sql-server sql-server-2008

我有两个具有以下(虚拟)结构的表:

Table 1
idText     sText(nvarchar(500))
1           Text with some keywords
2           Text2 with one keyword
3           Text3 with three keywords

Table 2 
idText    idKey    sKeyword  
1           1       some
1           2       keywords
2           3       one
3           4       with
3           2       keywords
3           5       three

有没有办法在Table2的所有相关关键字中执行嵌套替换?

有一些解决方案就像创建一个函数一样,但我认为这不是一个好的解决方案,因为这不会在其他任何地方重复使用。我也尝试过递归CTE,但没有成功。

结果必须是这样的:

Table 1
idText     sText(nvarchar(500))
1           Text with Replaced_some Replaced_keywords
2           Text2 with Replaced_one keyword
3           Text3 Replaced_with Replaced_three Replaced_keywords

PS。

  • 替换字符串已修复。所以你可以使用你喜欢的字符串。替换句子是这样的:replace(sText, sKeyword, 'Replaced_' + sKeyowrd)
  • 在这种情况下,IdKey无用,但它是我们真正的数据库结构的一部分

这是我使用递归CTE失败的尝试:

DECLARE @Table1 TABLE(  ID int,   sText nvarchar(200))
DECLARE @Table2 TABLE(  ID int,   sKeyword nvarchar(10))

INSERT INTO @Table1 VALUES(1, 'Text with some keywords')
INSERT INTO @Table1 VALUES(2, 'Text2 with one keyword')
INSERT INTO @Table1 VALUES(3, 'Text3 with three keywords')

INSERT INTO @Table2 VALUES(1, 'some')
INSERT INTO @Table2 VALUES(1, 'keywords')
INSERT INTO @Table2 VALUES(2, 'one')
INSERT INTO @Table2 VALUES(3, 'with')
INSERT INTO @Table2 VALUES(3, 'keywords')
INSERT INTO @Table2 VALUES(3, 'three')

;WITH CTE AS(

SELECT ID, sText FROM @Table1 
UNION ALL
SELECT c.ID, CAST(REPLACE(sText, sKeyword, 'New_' + sKeyword) AS nvarchar(200))  FROM CTE c 
INNER JOIN @Table2 t2 ON t2.ID = c.ID
) 
SELECT * FROM CTE 

结果是一个无限循环,它不会停止。

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

免责声明:按照承诺缩减功能,将及时更新答案说明。

根据我目前对您的问题的理解,我认为我可以将其应用于我设计的功能,以解决我最近遇到的更复杂的问题。可能还有其他解决方案,但大多数肯定是其他解决方案。会提出这些建议,那么为什么我不能为你提供少一点的东西。

但请注意,它的目的是解决比你更复杂的事情稍后解释),现在 我很遗憾地没有&# 39;有时间减肥,但我明天可能会这样做。我希望评论有所帮助。无论如何,我将总结我的职能目标:

有一个表格,其中包含要查找的消息以及要替换它们的内容。该函数将接收文本值作为输入,将使用游标循环所述表,并且对于所述表中的每个记录,它将检查输入文本是否包含要替换的内容,并在适用时替换。

有关原始目标的两点注意事项。 首先,有一个嵌套循环来解决某个关键字多次存在的情况,因此需要多次替换。 第二,我还必须处理通配符,变量长度,以及是否在讨论的表中设置了替换标志。这两件事加上其他事情可能就是你发现很多奇怪材料飞来飞去的原因。

{{1}}