表名:商品表
序号  商品名称
 1    大米
 2    黄豆
 3    小米
null  云豆
null  红小豆
现在希望将“序号”中null的内容顺序递增填完整,所以写了下面一段代码。
update 商品表
set
序号 = (select MAX(isnull(序号,0)) + 1 from 商品表)
from 商品表
where 序号 is null
执行的结果是null位置重复填入了两个“4”。
请帮我改一改,谢谢。

解决方案 »

  1.   


    declare @i int
    set @i = 1update tb
    set id = @i,@i = @i+1
      

  2.   


    declare @i int
    set @i = (select max(id) from  tb)update tb
    set id = @i,@i = @i+1
    where id is null
      

  3.   


    --ver > =2005
    update tb
    set id = row_number() over( order by getdate())
    where id = null
    ??? 版本是?
      

  4.   

    谢谢AcHerat
    我正在写补充,你就回复了,真是快。我补充的内容就是:在不使用变量的前提下。
      

  5.   


    --> 测试数据:[TB]
    if object_id('[TB]') is not null drop table [TB]
    create table [TB]([序号] int,[商品名称] varchar(6))
    insert [TB]
    select 1,'大米' union all
    select 2,'黄豆' union all
    select 3,'小米' union all
    select null,'云豆' union all
    select null,'红小豆'select * from [TB]UPDATE dbo.TB
    SET [序号] = T.num
    FROM(
    SELECT num = ROW_NUMBER () OVER( ORDER BY GETDATE()),[商品名称] FROM dbo.TB)T
    WHERE T.[商品名称] = TB.[商品名称] AND TB.[序号] IS null/*
    序号 商品名称
    1 大米
    2 黄豆
    3 小米
    4 云豆
    5 红小豆*/
      

  6.   


    create table 商品表 (序号 int,商品名称 varchar(10))
    insert into 商品表 values (1,'大米')
    insert into 商品表 values (2,'黄豆')
    insert into 商品表 values (3,'小米')
    insert into 商品表 values (null,'云豆')
    insert into 商品表 values (null,'红小豆')with cte 
    as (select row_number() over( order by getdate()) id,序号,商品名称 from 商品表)update cte
    set 序号=id
    from cte 
    where 序号 is null
      

  7.   

    不使用变量和游标的话,只能用row_number() 了
      

  8.   

    商品名称有重复的话序号要自增吗?
    insert into 商品表 values (1,'大米')
    insert into 商品表 values (2,'黄豆')
    insert into 商品表 values (3,'小米')
    insert into 商品表 values (null,'云豆')
    insert into 商品表 values (null,'云豆')自增的话见7楼:
    序号    商品名称
    1    大米
    2    黄豆
    3    小米
    4    云豆
    5    云豆6楼的不自增的:
    序号    商品名称
    1    大米
    2    黄豆
    3    小米
    4    云豆
    4    云豆
      

  9.   


    --如果商品没重复的话
    create table #pro(ID int, pro varchar(10))
    insert into #pro
    select 1,'大米'
    union all select 2,'黄豆'
    union all select 3,'小米'
    union all select null,'红豆'
    union all select null,'红小豆'update #pro set ID=(select count(0)+1 from #pro where checksum(ID,Pro)>checksum(a.ID,a.Pro))
    from #pro as a
    where ID is nullselect * from #pro order by ID
    --
    ID          pro
    ----------- ----------
    1           大米
    2           黄豆
    3           小米
    4           红小豆
    5           红豆(5 行受影响)
      

  10.   

    row_number
    或者给你的表加一个自增列
    alter table tt add column id int identity(1,1)
      

  11.   

    步骤:
    1.select 含null的记录到临时表
    2.创建触发器,如果出入null的自动在前面的记录数上加1
    3.再把临时表中数据插回去