广泛的字符串操作——游标还是 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'
上面的例子可能不正确,但我希望你明白我的意思。
快速背景
我收到了我们营销团队的一个项目,要对将在我们网站上显示的产品(> 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'
上面的例子可能不正确,但我希望你明白我的意思。