窗口函数只能出现在游标中的SELECT或ORDER BY子句中

时间:2017-01-29 13:36:32

标签: sql-server

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子句中

2 个答案:

答案 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是唯一的,它可能不会是连续的