SQL 现有列的增量值
SQL Incremental Value for Existing Column
我在 sql 服务器中有一个具有以下结构的 table,我想创建一个更新存储过程来设置 seq_num 列的值。
fname
lname
orderid
seq_num
Torrey
Venard
246
376987
Gabey
Tate
247
376988
Germaine
Ferminger
248
376989
Nikita
Sharplin
249
376990
Boyd
Rannigan
250
376991
Claretta
Paoli
251
376992
Barn
Kulver
252
376993
Torrey
Venard
253
376994
Gabey
Tate
254
NULL
Germaine
Ferminger
255
NULL
Nikita
Sharplin
256
NULL
Boyd
Rannigan
257
NULL
总行数约为 20k。理想情况下,我们应该将此列作为自动增量,但我们正在寻找的是用下一个数字填充 NULL,如下所示:
fname
lname
orderid
seq_num
Torrey
Venard
246
376987
Gabey
Tate
247
376988
Germaine
Ferminger
248
376989
Nikita
Sharplin
249
376990
Boyd
Rannigan
250
376991
Claretta
Paoli
251
376992
Barn
Kulver
252
376993
Torrey
Venard
253
376994
Gabey
Tate
254
376995
Germaine
Ferminger
255
376996
Nikita
Sharplin
256
376997
Boyd
Rannigan
257
376998
任何想法建议将不胜感激!
我认为 seq_num 列是整数。所以你可以尝试使用 cursor
如下:
DECLARE @Orderid int
DECLARE Seq_CURSOR CURSOR FOR
Select Orderid from table1 Where seq_num IS NULL Order by Orderid
OPEN Seq_CURSOR
BEGIN TRY
FETCH NEXT FROM Seq_CURSOR INTO @Orderid
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN TRAN
Update table1 set seq_num = (Select Max(seq_num)+1 from table1 ) Where orderId = @Orderid
FETCH NEXT FROM Seq_CURSOR INTO @Orderid
SET CURSOR_CLOSE_ON_COMMIT OFF;
COMMIT TRAN;
END
DEALLOCATE Seq_CURSOR;
END TRY
BEGIN CATCH
PRINT ERROR_MESSAGE()
ROLLBACK
END CATCH
CLOSE Seq_CURSOR
DEALLOCATE Seq_CURSOR
我在 sql 服务器中有一个具有以下结构的 table,我想创建一个更新存储过程来设置 seq_num 列的值。
fname | lname | orderid | seq_num |
---|---|---|---|
Torrey | Venard | 246 | 376987 |
Gabey | Tate | 247 | 376988 |
Germaine | Ferminger | 248 | 376989 |
Nikita | Sharplin | 249 | 376990 |
Boyd | Rannigan | 250 | 376991 |
Claretta | Paoli | 251 | 376992 |
Barn | Kulver | 252 | 376993 |
Torrey | Venard | 253 | 376994 |
Gabey | Tate | 254 | NULL |
Germaine | Ferminger | 255 | NULL |
Nikita | Sharplin | 256 | NULL |
Boyd | Rannigan | 257 | NULL |
总行数约为 20k。理想情况下,我们应该将此列作为自动增量,但我们正在寻找的是用下一个数字填充 NULL,如下所示:
fname | lname | orderid | seq_num |
---|---|---|---|
Torrey | Venard | 246 | 376987 |
Gabey | Tate | 247 | 376988 |
Germaine | Ferminger | 248 | 376989 |
Nikita | Sharplin | 249 | 376990 |
Boyd | Rannigan | 250 | 376991 |
Claretta | Paoli | 251 | 376992 |
Barn | Kulver | 252 | 376993 |
Torrey | Venard | 253 | 376994 |
Gabey | Tate | 254 | 376995 |
Germaine | Ferminger | 255 | 376996 |
Nikita | Sharplin | 256 | 376997 |
Boyd | Rannigan | 257 | 376998 |
任何想法建议将不胜感激!
我认为 seq_num 列是整数。所以你可以尝试使用 cursor
如下:
DECLARE @Orderid int
DECLARE Seq_CURSOR CURSOR FOR
Select Orderid from table1 Where seq_num IS NULL Order by Orderid
OPEN Seq_CURSOR
BEGIN TRY
FETCH NEXT FROM Seq_CURSOR INTO @Orderid
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN TRAN
Update table1 set seq_num = (Select Max(seq_num)+1 from table1 ) Where orderId = @Orderid
FETCH NEXT FROM Seq_CURSOR INTO @Orderid
SET CURSOR_CLOSE_ON_COMMIT OFF;
COMMIT TRAN;
END
DEALLOCATE Seq_CURSOR;
END TRY
BEGIN CATCH
PRINT ERROR_MESSAGE()
ROLLBACK
END CATCH
CLOSE Seq_CURSOR
DEALLOCATE Seq_CURSOR