有费用明细表fymx
其中一个收费单号 sfdh 可能要收很多笔费用,如:sfdh收费单号   xh序号   je金额  sfxmmc收费项目名称
00001          1          50         鞋子
00001          2          10         毛衣  
00001          3          20         袜子
00001          4          80         大衣
00001          5          40         毛巾00002          1          60         手套
00002          2          70         香皂
00002          3          20         牙刷00003          1          30         皮带
00003          2          80         裤子
00003          3          90         袜子
……现在是由于某种原因,表中的xh 全部为空,我要重新给
它们把xh添上,该如何写处理时间最快呢?我自己写的游标语句要处理几个小时,因为数据量很庞大。大概
这张表中有10万条记录。SELECT *,IDENTITY(INT,1,1) IXH INTO #fymx FROM fydb..fymx 
where csfdh= @sfd

解决方案 »

  1.   

    直接update
    eg:
    declare @i int
    update ta set id = @i,@i = @i +1
      

  2.   

    select
      id=row_number()over(order by getdate()),* 
    from 
      tb
      

  3.   

    row_number()over(order by getdate()) 已经用过,处理10万条数据要几个小时,不适用啊~!
      

  4.   

    ;with t as
    (
      select rn=row_number()over(partition by sfdh order by getdate()),*
      from fymx
    )
    update t set xh=rn
      

  5.   

    --------------------------------------------------------------------------
    --  Author : htl258(Tony)
    --  Date   : 2010-04-11 15:21:19
    --  Version:Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) 
    --          Jul  9 2008 14:43:34 
    --          Copyright (c) 1988-2008 Microsoft Corporation
    --          Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)
    --------------------------------------------------------------------------
    --> 生成测试数据表:fymxIF NOT OBJECT_ID('[fymx]') IS NULL
    DROP TABLE [fymx]
    GO
    CREATE TABLE [fymx]([sfdh] NVARCHAR(10),[xh] INT,[je] INT,[sfxmmc] NVARCHAR(10))
    INSERT [fymx]
    SELECT '00001',NULL,50,N'鞋子' UNION ALL
    SELECT '00001',NULL,10,N'毛衣' UNION ALL
    SELECT '00001',NULL,20,N'袜子' UNION ALL
    SELECT '00001',NULL,80,N'大衣' UNION ALL
    SELECT '00001',NULL,40,N'毛巾' UNION ALL
    SELECT '00002',NULL,60,N'手套' UNION ALL
    SELECT '00002',NULL,70,N'香皂' UNION ALL
    SELECT '00002',NULL,20,N'牙刷' UNION ALL
    SELECT '00003',NULL,30,N'皮带' UNION ALL
    SELECT '00003',NULL,80,N'裤子' UNION ALL
    SELECT '00003',NULL,90,N'袜子'
    GO
    --SELECT * FROM [fymx]-->SQL查询如下:
    declare @j int,@i int
    update fymx set [xh] = @j,@j = case when @i <> [sfdh] then 1 else isnull(@j,0)+1 end,@i=[sfdh]select * from fymx
    /*
    sfdh       xh          je          sfxmmc
    ---------- ----------- ----------- ----------
    00001      1           50          鞋子
    00001      2           10          毛衣
    00001      3           20          袜子
    00001      4           80          大衣
    00001      5           40          毛巾
    00002      1           60          手套
    00002      2           70          香皂
    00002      3           20          牙刷
    00003      1           30          皮带
    00003      2           80          裤子
    00003      3           90          袜子(11 行受影响)
    */