日期:2014-05-17  浏览次数:20747 次

好久未来了,请教高手,自动填充一字段为空的部分为规则数值
字段A有空也有带数值的
如何把空值的部分加上数值
要求
1、不能重复
2、按2000000000001起增加,2000000000002,2000000000003....
3、效率要高,因为字段A可能有十万行数据。
4、执行语句遇到死机等特殊情况时,能否对数据库避免产生影响。

SQL2005 谢谢!

------解决方案--------------------
SQL code
 /********************************************************************************            
 *主题: SQl 2008/2005 论坛问题解答           
 *说明:本文是个人学习的一些笔记和个人愚见            
 *      有很多地方你可能觉得有异议,欢迎一起讨论            
            
 *作者:Stephenzhou(阿蒙)            
 *日期: 2012.08.7          
 *Mail:szstephenzhou@163.com            
 *另外:转载请著名出处。            
**********************************************************************************/  

  
--字段A有空也有带数值的
--如何把空值的部分加上数值
--要求
--1、不能重复
--2、按2000000000001起增加,2000000000002,2000000000003....
--3、效率要高,因为字段A可能有十万行数据。
--4、执行语句遇到死机等特殊情况时,能否对数据库避免产生影响。

--SQL2005 谢谢!




--输入测试数据

use DBText
go
if OBJECT_ID('tb_test') is not null
drop table tb_test
go

create table tb_test(id int identity primary key,A varchar(50))
go

declare @i int;
set @i=0;
while @i<300
begin
if right (DATEPART(ms,GETDATE()),1)=0
insert into tb_test values('test'+cast(@i as varchar));
else 
 insert into tb_test values(null);
 set @i=@i+1
 end
 go
   --查看测试数据
   select * from tb_test
   
   /*
   id          A
----------- --------------------------------------------------
1           NULL
2           NULL
3           test2
4           test3
5           test4
6           test5
7           test6
8           test7
9           test8
10          test9
11          test10
12          test11
13          test12
14          test13
15          test14
16          test15
17          test16
18          test17
.
.
.
.

38          test37
39          NULL
40          NULL
41          NULL
42          NULL
43          NULL
44          NULL
45          NULL
46          NULL
47          NULL
48          NULL
49          NULL

...
...
..
297         NULL
298         NULL
299         NULL
300         NULL
   */
   
   --按照LZ说的情况更新 
   
   declare @str varchar(50)
   set @str='2000000000000' 
   update tb_test    set   A=m.Ae from 
   (
   select t.id as id ,t.A as A ,f.id as fid ,f.A as fA ,f.Ae as Ae from tb_test t left join (
   select * ,Ae=(left(@str,len(@str)-LEN(s.rn))+CAST(s.rn as varchar)) from 
   (  select * ,ROW_NUMBER()over(partition by A order by id) as rn from tb_test where A is null )s   )f on f.id=t.id)m
   
    where    tb_test.A is null and  tb_test.id=m.id
    
    
    ---输出更新后的结果集合
    select * from tb_test
    /*
    id          A
----------- --------------------------------------------------
1           2000000000001
2           2000000000002
3           2000000000003
4           2000000000004
5           2000000000005
6           2000000000006
7           test6
8           test7
9           test8
10          test9
11          2000000000007
12          2000000000008
13          2000000000009
14          2000000000010
15          2000000000011
16          2000000000012
17          2000000000013
18          2000000000014
19          2000000000015
20          2000000000016
21          2000000000017
22          2000000000018
23          2000000000019
24          2000000000020
25          2000000000021
26          2000000000022
27          2000000000023
28          2000000000024
29          2000000000025
30          2000000000026
31          2000000000027
32          2000000000028
33          2000000000029
34          2000000000030
35          2000000000031
36          2000000000032
37          2000000000033
38          2000000000034
39          2000000000035
40          2000000000036
41          2000000000037
42          2000000000038
43          2000000000039
44          2000000000040
45          test44
46          test45
47          test46
48          test47
49          test48
50          test49
51          test50
52          test51
53          test52
54          test53
55          test54
56