Declare @Customerid int
DECLARE ChangeCustomerName CURSOR FOR
select customerid from customer
OPEN ChangeCustomerName
FETCH NEXT FROM ChangeCustomerName into @Customerid
WHILE @@fetch_status = 0
BEGIN
update customer set customername ='Customer'
+convert (varchar(10),ROW_NUMBER() OVER(ORDER BY customerid ASC))
where customerid=@Customerid
FETCH NEXT FROM ChangeCustomerName into @Customerid
END
close ChangeCustomerName
deallocate ChangeCustomerName
窗口函数只能出现在游标
中的SELECT或ORDER BY子句中
答案 0 :(得分:6)
您似乎正在尝试将客户名称设置为顺序值。为此,您不需要光标!就像这样:
with toupdate as (
select c.*, row_number() over (order by customerid) as seqnum
from customer c
)
update toupdate
set customername = 'Customer' + convert(varchar(10), seqnum);
你应该尽可能避免使用游标。基于集合的操作更有效,并且通常可以使代码更简单。
答案 1 :(得分:0)
不确定为什么要创建客户名称。
您当前的方法可能适用于现有记录,但对于新条目,您再次运行更新查询,并且有可能同一客户在删除后获得不同的客户名称。所以我建议你创建一个计算列。
您可以将customername
设为计算列
Alter table customer
add customername as 'Customer'+convert (varchar(10),customerid) PERSISTED
注意:如果customerid
是唯一的,它可能不会是连续的