广泛的字符串操作——游标还是 While 循环?

Extensive String Manipulation - Cursor or While-Loop?

快速背景

我收到了我们营销团队的一个项目,要对将在我们网站上显示的产品(> 50 万项)的描述进行批量更新。他们决定采用数十年的描述,并尝试使它们尽可能相似。 (例如 'screw driver'、'screwdriver'、'screw-driver' 都应该看起来像 'Screwdriver')

我成功地完成了手头的任务,他们使用笨重、冗长且难以维护的一系列更新语句成功地完成了手头的任务,只有我维护了 table 来修改字符串。然后我将这些传递给我们的网络部署团队,但没想到他们会想要无限期地维护它。

我可以轻松生成 table 子字符串和条件以查找和替换字符串部分的内容。我认为像这样依赖于 table 的东西对于我们遇到的 90% 的情况来说是最容易维护的。

现在,我不确定继续进行以使其可靠且易于维护的最佳方法。我收到相互矛盾的信息,一个好的用途是 'while loop',而其他人说一个 Cursor 就可以了。

现在回答问题

鉴于我们 will/may/could 每月添加大约 1k 新产品,并且我有 table 如下条件,定期执行操作的最有效和最可靠的方法是什么?


条件,Find_substring,Replace_with


喜欢“%螺丝刀%”,'screw driver','Screwdriver'


喜欢“%screw-driver%”,'screw driver','Screwdriver'


喜欢“%screwdriver%”,'screwdriver','Screwdriver'

乐于接受任何想法、建议和建议。

如果您的规则真的这么简单,那么只需在 table 中包含 "old_value" 和 "new_value" 就足够了,只需一条语句即可修复所有数据:

UPDATE
    MT
SET
    description = REPLACE(description, old_value, new_value)
FROM
    dbo.My_Table MT
INNER JOIN dbo.Fix_Table FT ON MT.description LIKE '%' + FT.old_value + '%'

如果您希望单个产品有多个匹配项,您可能需要调整查询。另外,请注意可能属于另一个字符串的字符串。例如,将 "ax" 固定为 "axe" 可能会导致 "fax machine" 出现问题。有很多像这样的小细节可能会影响确切的方法。

有一个 table,比如 bad_val 和 good_val(称之为 tblMod)。您可以编写一个存储过程,在 tblMod 上循环并生成 SQL 语句并将该语句作为动态 SQL 执行。

loop on tblMod
-- generate SQL statements like:
set sqlText = 'update myTable set description = ' + good_val + ' where description = ' + bad_val
sp_execute sqlText

此方法还允许您使用 SQL 函数或 tblMod 的 good_val 字段中的任何其他函数。例如,您可以在 good_val 字段中包含以下数据:'upper(description)' 或 'substring(description, 1 ,4)'

当您生成动态 SQL 时,这些将起作用。 在这种情况下,您的 sqlText 将类似于

'update myTable set description = substring(description, 1, 4) where description = 'some bad value'

上面的例子可能不正确,但我希望你明白我的意思。