广泛的字符串操作 - 光标还是循环?

时间:2016-01-11 16:39:13

标签: sql sql-server while-loop cursor

快速背景

我已收到营销团队的一个项目,对我们网站上显示的产品说明进行批量更新(> 500k项目)。他们决定采用数十年的描述,并尽量使它们尽可能相似。 (例如'螺丝刀','螺丝刀','螺丝刀'应该看起来都像'螺丝刀')

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

我可以轻松地生成一个子字符串表和条件表来查找和替换部分字符串。我认为,对于我们遇到的90%的情况,依赖于这样的表格的内容最容易维护。

现在,我不确定如何使其可靠且易于维护的最佳方法。我收到了相互矛盾的信息,好用的是'while循环',而其他人说光标就好了。

现在回答问题

鉴于我们将/可能/可能每月增加大约1k个新产品,我有一个如下条件的表格,定期执行操作的最有效和最可靠的方法是什么?

条件,Find_substring,Replace_with

像'%screw driver%','螺丝刀','螺丝刀'

像'%screw-driver%','螺丝刀','螺丝刀'

喜欢'%螺丝刀%','螺丝刀','螺丝刀'

对所有想法,建议和建议持开放态度。

2 个答案:

答案 0 :(得分:2)

如果您的规则非常简单,那么只需在表中使用“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”固定为“ax”可能会导致“传真机”出现问题。像这样的很多小细节可能会影响确切的方法。

答案 1 :(得分:1)

有一个像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

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

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

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

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