日期:2014-05-18  浏览次数:20900 次

sql 并发的一个问题
要手工生成一个 带字母的自增列

  select @newid = max(id) from tb 
  set @newid = xxxxx;
  insert into tb (id) value (@newid) where xxxx

怎么在这个过程中 保证@newid 一定是最大的 

我记得sql 中 有 锁 的概念

不知道怎么用法

------解决方案--------------------
SQL code
BEGIN TRAN
  select @newid = max(id) from tb  WITH(XLOCK,HOLDLOCK)
  set @newid = xxxxx;
  insert into tb (id) value (@newid) where xxxx
COMMIT TRAN

------解决方案--------------------
带字母的自增列?
到是没有听说过@!

你可以创建一个数字自增列,然后创建一个计算列,将你想要的字母,与数字自增列连接运算作为你的计算式,这样,就能保证你的"字母自增列"为最大了.
------解决方案--------------------
另外建立一个最大ID管理表(maxID int),每次需要取最大ID的时候,先更新MaxID+1,再取出来
如:update 最大ID管理表 set maxID+1;select maxID;
这样就可以保证同时取ID时重复的可能
------解决方案--------------------
探讨
另外建立一个最大ID管理表(maxID int),每次需要取最大ID的时候,先更新MaxID+1,再取出来
如:update 最大ID管理表 set maxID+1;select maxID;
这样就可以保证同时取ID时重复的可能

------解决方案--------------------
SQL code
create table tb(id int identity(1,1),
alp as char((id-1)%26+97)+(case when id>26 then char((id/26-1)%26+97) else '' end),col int) --alp列位数不够再加
insert into tb(col) select number from master..spt_values where type='p' and number<100
go
select * from tb
/*
id          alp  col
----------- ---- -----------
1           a    0
2           b    1
3           c    2
4           d    3
5           e    4
6           f    5
7           g    6
8           h    7
9           i    8
10          j    9
11          k    10
12          l    11
13          m    12
14          n    13
15          o    14
16          p    15
17          q    16
18          r    17
19          s    18
20          t    19
21          u    20
22          v    21
23          w    22
24          x    23
25          y    24
26          z    25
27          aa   26
28          ba   27
29          ca   28
30          da   29
31          ea   30
32          fa   31
33          ga   32
34          ha   33
35          ia   34
36          ja   35
37          ka   36
38          la   37
39          ma   38
40          na   39
41          oa   40
42          pa   41
43          qa   42
44          ra   43
45          sa   44
46          ta   45
47          ua   46
48          va   47
49          wa   48
50          xa   49
51          ya   50
52          zb   51
53          ab   52
54          bb   53
55          cb   54
56          db   55
57          eb   56
58          fb   57
59          gb   58
60          hb   59
61          ib   60
62          jb   61
63          kb   62
64          lb   63
65          mb   64
66          nb   65
67          ob   66
68          pb   67
69          qb   68
70          rb   69
71          sb   70
72          tb   71
73          ub   72
74          vb   73
75          wb   74
76          xb   75
77          yb   76
78          zc   77
79          ac   78
80          bc   79
81          cc   80
82          dc   81
83          ec   82
84          fc   83
85          gc   84
86          hc   85
87          ic   86
88          jc   87
89          kc   88
90          lc   89
91          mc   90
92          nc   91
93          oc   92
94          pc   93
95          qc   94
96          rc   95
97          sc   96
98          tc   97
99          uc   98
100         vc   99

(100 行受影响)


*/
go
drop table tb