按顺序更新SQL Server表中的字段
我有一个带有列按顺序更新SQL Server表中的字段,sql,sql-server-2012,sql-update,Sql,Sql Server 2012,Sql Update,我有一个带有列DisplayName的表对象。名称中的值包括乔·史密斯,约翰·史密斯,简·史密斯。这种情况持续了数千条记录 我想更新表,以便从记录1开始直到最后一条记录,DisplayName的值如下所示。乔·史密斯=顾客1,约翰·史密斯=顾客2,简·史密斯=顾客3。。。依此类推,直到所有名称列都依次显示Customer,并附加一个数字,而不是列的当前值 这是SQL Server 2012 ***下面的例子不起作用,我已经修改了我的问题。我的错是没有包括足够的细节。该表称为Aoobject。需要
DisplayName
的表对象。名称中的值包括乔·史密斯
,约翰·史密斯
,简·史密斯
。这种情况持续了数千条记录
我想更新表,以便从记录1开始直到最后一条记录,DisplayName的值如下所示。乔·史密斯=顾客1,约翰·史密斯=顾客2,简·史密斯=顾客3。。。依此类推,直到所有名称列都依次显示Customer,并附加一个数字,而不是列的当前值
这是SQL Server 2012
***下面的例子不起作用,我已经修改了我的问题。我的错是没有包括足够的细节。该表称为Aoobject。需要更改的字段实际上称为DisplayName。我需要用如下内容过滤结果集
Where ObjectDescription in ('Portfolio Description', 'Portfolio Group Description')
这似乎是个坏主意——“客户号”应该放在一个单独的栏中。它不是名字的一部分。但是,这很容易做到:
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;
这仅在需要时(对于具有重复项的全名)才附加唯一编号。而且,它将数字的基数保持在尽可能低的水平,因此只有一个数字可以作为后缀。这似乎是个坏主意——“客户号”应该放在单独的列中。它不是名字的一部分。但是,这很容易做到:
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;
这仅在需要时(对于具有重复项的全名)才附加唯一编号。而且,它将数字的基数保持在尽可能低的水平,因此只有一个数字可以作为后缀。类似的方法就可以了。 希望客户名称是唯一的
;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
这样就行了。 希望客户名称是唯一的
;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
类似于
SET col=Customer+RANK(诸如此类)
类似于SET col=Customer+RANK(诸如此类)
如果您发布代码、XML或数据示例,请在文本编辑器中突出显示这些行,并单击编辑器工具栏上的“代码示例”按钮({}
),以很好地格式化和语法突出显示它!我对我的问题做了一些修改。您能再看一看吗?如果您发布代码、XML或数据示例,请在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码示例”按钮({}
),以很好地格式化和语法突出显示它!我对我的问题做了一些修改。你能再看一下吗?已经有一个客户编号栏了。我只需要一个方法来保持名字的唯一性,一个数字就足够了。我在我原来的帖子中添加了更多细节。我省略了一些重要信息。已经有一个客户编号列。我只需要一个方法来保持名字的唯一性,一个数字就足够了。我在我原来的帖子中添加了更多细节。我遗漏了一些重要的信息。