是这样的我有一个标识字段是按照某种标准来生成的
这个字段的后四位为流水号即
**********0001
**********0002
**********0003
我在代码是用的是游标
UPDATE ENG_MST SET ENG_ID=@ENG_ID WHERE ENG_ID=@Eng_Old_ID
这个@ENG_ID就是上面的那种数据.可是我现在生成的流水号总是相同的
都是这样的
*********0001
*********0001代码
SELECT TOP 1 @MaxENG_ID=MAX(ENG_ID) FROM ENG_MST WHERE ASC_CD=@ASC_CD
AND SUBSTRING(ENG_ID,1,11)=@PreENG_ID AND LEN(ENG_ID)=15
--ORDER BY ENG_ID DESC
IF ISNULL(@MaxENG_ID,'')=''
SET @ENG_ID=@PreENG_ID+'0001'
ELSE
BEGIN
SET @ENG_ID=@PreENG_ID + SUBSTRING('0000',1,4-LEN(CAST(SUBSTRING(@MaxENG_ID,12,4) AS INT)+1))
+ CAST(CAST(SUBSTRING(@MaxENG_ID,12,4) AS INT)+1 AS CHAR)
END
BEGIN TRANSACTION
UPDATE ENG_MST SET ENG_ID=@ENG_ID WHERE ENG_ID=@Eng_Old_ID
COMMIT TRANSACTION
这个字段的后四位为流水号即
**********0001
**********0002
**********0003
我在代码是用的是游标
UPDATE ENG_MST SET ENG_ID=@ENG_ID WHERE ENG_ID=@Eng_Old_ID
这个@ENG_ID就是上面的那种数据.可是我现在生成的流水号总是相同的
都是这样的
*********0001
*********0001代码
SELECT TOP 1 @MaxENG_ID=MAX(ENG_ID) FROM ENG_MST WHERE ASC_CD=@ASC_CD
AND SUBSTRING(ENG_ID,1,11)=@PreENG_ID AND LEN(ENG_ID)=15
--ORDER BY ENG_ID DESC
IF ISNULL(@MaxENG_ID,'')=''
SET @ENG_ID=@PreENG_ID+'0001'
ELSE
BEGIN
SET @ENG_ID=@PreENG_ID + SUBSTRING('0000',1,4-LEN(CAST(SUBSTRING(@MaxENG_ID,12,4) AS INT)+1))
+ CAST(CAST(SUBSTRING(@MaxENG_ID,12,4) AS INT)+1 AS CHAR)
END
BEGIN TRANSACTION
UPDATE ENG_MST SET ENG_ID=@ENG_ID WHERE ENG_ID=@Eng_Old_ID
COMMIT TRANSACTION
解决方案 »
- 汇总问题
- 列名 'dayclicktime' 无效。 帮忙看看是什么原因。
- {"当 IDENTITY_INSERT 设置为 OFF 时,不能向表 'countUnit' 中的标识列插入显式值。"}
- 请教求sql中的排名语句
- 匪疑所思的排序问题,不知道能否实现,谢谢大家帮帮忙啊~
- 对一个表(三个键作为主键)进行分组统计,急!谢谢!
- 如何把ORACLE数据库中的数据导到SQL数据库中
- 只查询允许有8行,不够就补为空行,这样的SQL语句怎么写呀?
- 如此SQL,怎么取值??
- 关于spt(sql pass through)的问题
- 请问如果将“2006-4-19 05:11:33”转化为“2006-4-19 05:10:00”
- 建立一个教学系统的数据库,各位帮看看,给点评价
AND SUBSTRING(ENG_ID,1,11)=@PreENG_ID AND LEN(ENG_ID)=15
IF ISNULL(@MaxENG_ID,'')=''
SET @ENG_ID=@PreENG_ID+'0001'
ELSE
BEGIN
SET @ENG_ID=@PreENG_ID + SUBSTRING('0000',1,4-LEN(CAST(SUBSTRING(@MaxENG_ID,12,4) AS INT)+1)) + CAST(CAST(SUBSTRING(@MaxENG_ID,12,4) AS INT)+1 AS CHAR)
END
BEGIN TRANSACTION
UPDATE ENG_MST SET ENG_ID=@ENG_ID WHERE ENG_ID=@Eng_Old_ID
COMMIT TRANSACTION
AND SUBSTRING(ENG_ID,1,11)=@PreENG_ID AND LEN(ENG_ID)=15
--ORDER BY ENG_ID DESC
IF ISNULL(@MaxENG_ID,'')=''
SET @ENG_ID=@PreENG_ID+'0001'
ELSE
BEGIN
SET @ENG_ID= @PreENG_ID
+ right('0000' +
(cast(right(@MaxENG_ID,4) AS INT+1 as varchar),4)
ENDUPDATE ENG_MST SET ENG_ID=@ENG_ID WHERE ENG_ID=@Eng_Old_ID
DECLARE @t TABLE(
ID char(4),
col int)
INSERT @t(col)
SELECT TOP 6 id FROM sysobjects-- 生成流水号
DECLARE @id int
SET @id = 10000
UPDATE @t SET @id = @id +1, ID = RIGHT(@id, 4)-- 显示结果
SELECT * FROM @t
-- 结果:
ID col
---- -----------
0001 4
0002 5
0003 7
0004 8
0005 13
0006 15(6 行受影响)
SELECT A.ASC_CD,A.ENG_ID FROM ENG_MST A,(
SELECT ASC_CD,IDCARD
FROM ENG_MST
GROUP BY IDCARD,ASC_CD
HAVING COUNT(*)=1) AS T
WHERE A.ASC_CD=T.ASC_CD AND A.IDCARD=T.IDCARD AND USED='Y'
OPEN Eng_Cursor
FETCH NEXT FROM Eng_Cursor INTO @ASC_CD,@Eng_Old_ID
WHILE @@FETCH_STATUS = 0
BEGIN
SET @PreENG_ID=SUBSTRING(@ASC_CD,4,7) + SUBSTRING(CONVERT(VARCHAR(8),GETDATE(),112),3,4)SELECT TOP 1 @MaxENG_ID=MAX(ENG_ID) FROM ENG_MST WHERE ASC_CD=@ASC_CD
AND SUBSTRING(ENG_ID,1,11)=@PreENG_ID AND LEN(ENG_ID)=15
IF ISNULL(@MaxENG_ID,'')=''
SET @ENG_ID=@PreENG_ID+'0001'
ELSE
BEGIN
SET @ENG_ID=@PreENG_ID + SUBSTRING('0000',1,4-LEN(CAST(SUBSTRING(@MaxENG_ID,12,4) AS INT)+1)) + CAST(CAST(SUBSTRING(@MaxENG_ID,12,4) AS INT)+1 AS CHAR)
END
BEGIN TRANSACTION
UPDATE ENG_MST SET ENG_ID=@ENG_ID WHERE ENG_ID=@Eng_Old_ID
COMMIT TRANSACTION
IF EXISTS(SELECT ENG_PRO_ID FROM ENG_PRODUCT WHERE ENG_ID=@ENG_Old_ID)
BEGIN
UPDATE ENG_PRODUCT SET ENG_ID=@ENG_ID FROM ENG_MST,ENG_PRODUCT WHERE ENG_MST.ENG_ID=ENG_PRODUCT.ENG_ID
END
FETCH NEXT FROM Eng_Cursor INTO @ASC_CD,@Eng_Old_ID
END
嘿,好久不见了邹建大哥.这是我的核心代码.谢谢我没有用自定义函数.我也不清楚怎么会这样
只UPDATE一个值
其实你自己的那个算法也没问题的SUBSTRING('0000',1,4-LEN(CAST(SUBSTRING(@MaxENG_ID,12,4) AS INT)+1)) + CAST(CAST(SUBSTRING(@MaxENG_ID,12,4) AS INT)+1 AS CHAR)