【问题标题】:Nvarchar column value is doubled, how do I detect and fix this?Nvarchar 列值加倍,我该如何检测和解决这个问题?
【发布时间】:2013-09-04 03:00:58
【问题描述】:

我继承了一个项目,该项目以某种方式最终导致应用程序设置表中的随机行重复。我成功删除了重复的行,但后来我注意到 nvarchar 类型的实际值也重复了。

例如,一行有 Key 列 Error Email Address 和 Value 列 websupport@mycompany.com,websupport@mycompany.com。值列应该只包含websupport@mycompany.com。有很多这样的记录,都遵循The value,The value的相同模式。

如何检测 Value 列何时包含此类重复数据并进行更正?

请注意,仅逗号不足以说明该行无效,因为 Key Default Error Message Value Oops, something went wrong 之类的内容是正确的并且还包含逗号。

【问题讨论】:

  • 您需要更好地定义一个值何时允许包含逗号,何时不允许。您当然可以编写一个约束来捕获它,但几乎可以肯定它是基于调用插入的代码或执行插入的存储过程。检查/调试该代码有多难?
  • 似乎只有错误消息应该有一个逗号作为值的一部分,而其他所有内容都存储一个逗号分隔的数字/字符串列表。上面的错误电子邮件示例导致我们在出现错误时收到两封相同的电子邮件,并且存在有效的情况,例如需要通知两个不同的人某事。虽然在列中存储值列表当然不好,但这正是我必须使用的。

标签: sql sql-server


【解决方案1】:

这是一个可以解决问题的update

update t
    set value = left(value, len(val)/2)
    where left(value, len(val)/2) = right(value, len(val)/2) and
          substring(value, (len(val)/2) + 1, 1) = ',';

您可以先通过select 来验证逻辑:

select value
from t
where left(value, len(val)/2) = right(value, len(val)/2) and
      substring(value, (len(val)/2) + 1, 1) = ',';

【讨论】:

    【解决方案2】:

    这里是查询:

    Update TableName
    set Col1=substring(Col1,0,charindex(',',Col1))
    where substring(Col1,0,charindex(',',Col1))=substring(Col1,charindex(',',Col1)+1,500)
    

    将 Col1 替换为列名,将 TableName 替换为实际的表名。它只会用单个值替换逗号(,)前后值相同的行。

    【讨论】:

      【解决方案3】:

      select * from blah where email like '%@%,%@%'

      您似乎还有其他关于如何插入不良数据的问题。

      【讨论】:

        【解决方案4】:

        我会尝试类似https://stackoverflow.com/a/5123680/1504882 的方法,您将在列上拆分列,当左 = 右时将列更新为(无论您选择什么,左/右)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-03-25
          • 2020-02-14
          • 1970-01-01
          • 2021-10-23
          • 1970-01-01
          相关资源
          最近更新 更多