怎样更新一个已有数据SQL表的主键,自动填充部分编码~

来源:百度知道 编辑:UC知道 时间:2024/06/26 03:56:12
请教一个问题,如果要更新一个已有数据的SQL表的主键,能否实现前一部分数据指定(提取表的某个字段做前一部分的编码),后一部分编码自动累加?如果能,具体怎样实现呢?谢谢!

比如这样

【ptype】 表
typeID --为ptype 表主键(10-15位数字)
ParID --类编号(5-10位数字)
要取 ParID 作为Ptype 字段编码的前5-10位,后5位自动生成序列,更新原有不规则的编码。
-----------------------------------------------------------
编码的结构是这样的 typeID 为ParID编码+5位,每5位为一层编码
typeID ParID
000020000100025 0000200001
000050000300012 0000500003
0000600001 00006
0000600105 00006
00002000010002500003 0000200001 --也有这样不规则的
000060010500235 00006 --也有这样不规则的
-----------------------------------------------------------
如何能让 typeId 的编码更新成前把半部分为同行内的ParID,后面不规则的编码更新成顺序的规则的编码?
如果无法实现,生成一个临时表也行~再更新回来也行~
能不能再加上条件呢?比如 ParID 大于5位的才执行更新 ,否则保留原有 tpyeID。或者 ParID =''才执行更新,否则保留原有 tpyeID。

joinzhou 给的语句在执行后出现了这样的错误,
表中出现了 正常的15位编码 023810000200002
同时还有很多不正常的16位编码 0238100002100002 这

假设你的数据库是MSSQL SERVER,那么使用一个临时表和游标操作
可以满足你要求功能,SQL 语句序列如下:

====================================================
set nocount on

exec sp_addmessage 60000,16,'%05d','us_english',@replace ='replace'

select distinct ParID,0 AS C INTO TMP from table_name

DECLARE @ParID varchar(20),@C int

DECLARE cursor_name CURSOR
FOR SELECT ParID FROM table_name
FOR UPDATE OF TypeID
OPEN cursor_name

FETCH NEXT FROM cursor_name INTO @ParID
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE TMP SET C=C+1 WHERE ParID=@ParID
SELECT @C=C FROM TMP WHERE ParID=@ParID

UPDATE table_name SET TypeID=@ParID+formatmessage(60000,@C)
WHERE CURRENT OF cursor_name

FETCH NEXT FROM cursor_name INTO @ParID
END

CLOSE cursor_name
DEALLOCATE cursor_name

exec sp_dropmessage 60000,'us_english'
drop table tmp