根据现有值更新或删除表行

时间:2015-11-13 15:34:31

标签: sql sql-server tsql sql-server-2012

我的表A包含Name nvarchar(200) UNIQUE列。我编写了一个与NormalizeSpace一起工作的函数(修剪+将多个空格折叠为单个空格),问题是如何编写一个UPDATEDELETE Name的脚本列依赖是规范化名称是否已存在于表中:如果不存在UPDATE,则为DELETE

示例:

  'a bc' 
  ' a  bc'
  ' d  e'

结果:

  'a bc'
  'd e'

谢谢。

1 个答案:

答案 0 :(得分:2)

您可以分两步完成此操作(如果您使用merge,则为1):

-- Remove all but one copy of each value
with todelete as (
      select t.*,
             row_number() over (partition by dbo.NormalizeSpace(col) order by (select null)) as seqnum
      from t
     ) 
delete from todelete
    where seqnum > 1;

-- Now update the values to be normalized:
update t
    set col = dbo.NormalizeSpace(col)
    where col <> dbo.NormalizeSpace(col);