是这样的我有一个标识字段是按照某种标准来生成的
这个字段的后四位为流水号即
**********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

解决方案 »

  1.   

    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
      

  2.   

    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 
    + 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
      

  3.   

    游标在那?是自定义函数吧/如果是自定义函数, 则一个update 影响多条记录的话, 这个函数只会被调用一次, 而不是每更新到一条记录, 函数调用一次.
      

  4.   

    只针对这个流水号的生成, 可以简单的用下面的语句来生成:-- 测试数据
    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 行受影响)
      

  5.   

    DECLARE Eng_Cursor CURSOR FOR
    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
    嘿,好久不见了邹建大哥.这是我的核心代码.谢谢我没有用自定义函数.我也不清楚怎么会这样
      

  6.   

    是不是游标没有动的
    只UPDATE一个值
      

  7.   

    应该不会吧FETCH NEXT FROM Eng_Cursor INTO @ASC_CD,@Eng_Old_ID  --这句没问题的
      

  8.   

    流水号你看看邹老大的那个
    其实你自己的那个算法也没问题的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)