按顺序更新SQL Server表中的字段

时间:2014-04-18 14:07:31

标签: sql sql-server-2012 sql-update

我有一个带有DisplayName列的表AoObject。名称中包含Joe SmithJohn SmithJane Smith等值。这会持续数千条记录。

我想更新表,以便从记录一开始直到最后一条记录,DisplayName的值就是这样。 Joe Smith = Customer1,John Smith = Customer2,Jane Smith = Customer3 ...依此类推,直到所有名称列依次说出Customer附加了一个数字而不是该列的当前值。

这是SQL Server 2012

***以下示例不起作用,我已经修改了我的问题。我没有提供足够的细节。该表称为Aoobject。需要更改的字段实际上称为DisplayName。我需要使用以下内容过滤结果集。

Where ObjectDescription in ('Portfolio Description', 'Portfolio Group Description')

AoObject

2 个答案:

答案 0 :(得分:3)

这似乎是一个坏主意 - "客户编号"应该放在一个单独的栏目中。它不是名称的一部分。但是,这很容易做到:

with toupdate as (
      select t.*, row_number() over (order by recordnum) as seqnum
      from table t
     )
update toupdate
    set fullname = fullname + ' Customer' + cast(seqnum as varchar(255));

我假设你有一些记录编号(recordnum),因为问题是"记录一到最后一条记录"。

编辑:

如果您希望名称是唯一的,则只为重复的名称附加一个数字。

with toupdate as (
      select t.*,
             row_number() over (partition by fullname order by recordnum) as fn_seqnum,
             count(*) over (partition by fullname) as fn_cnt
      from table t
     )
update toupdate
    set fullname = fullname + ':' + cast(fn_seqnum as varchar(255));
    where fn_cnt > 1;

仅在需要时附加唯一编号(对于具有重复项的全名)。并且,它保持数字的基数尽可能低,因此只有一个数字应该足够后缀。

答案 1 :(得分:1)

这样的事情会做。 希望客户名称是唯一的。

;WITH cte_emp AS
(
SELECT CustomerName , ROW_NUMBER() over (order by CustomerName) slno
  FROM Customer
  )
UPDATE t SET CustomerName = 'Customer ' + cast(slno as varchar)
  FROM Customer t
 INNER JOIN cte_emp c ON t.CustomerName = c.CustomerName