2014-01-05 25 views
1
ALTER PROCEDURE [dbo].[K_FS_GenerateAutoDCNo] 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @dcno VARCHAR(50), @latestindent VARCHAR(50) 

    SET @dcno = (SELECT '0000') 
    SET @latestindent = (SELECT dcno FROM K_FS_GenerateDcno 
         WHERE sno = (SELECT max(sno)  
            FROM K_FS_GenerateDcno)) 

    IF EXISTS (SELECT dcno FROM K_FS_GenerateDcno WHERE dcno in (@dcno)) 
    BEGIN 
    SELECT (@latestindent + 1) AS dcno 
    END 
    ELSE 
    SELECT (@dcno) AS dcno 
END 

這表明第一次0000,在下一次顯示1如何增加數字?

但我想顯示0001 ..我該怎麼辦呢?

請幫我

+0

此過程具有併發問題。您可能會在[通常]重負載下得到重複的值。 –

+0

我認爲你的查詢可能存在一個小問題。在你的查詢達到9999條目後,下一個輸出是什麼?即使它回收並返回爲0001,您可能會遇到** PK **錯誤。我建議你給它添加一個時間戳或日期。請參閱此鏈接http://stackoverflow.com/questions/20883196/incrementing-custom-primary-key-values-in-sql – Mahe

+0

可能的重複http://stackoverflow.com/questions/20883196/incrementing-custom-primary- key-values-in-sql – Mahe

回答

2

要離開墊的價值與0 s提高到四位

RIGHT(REPLICATE('0', 4) + CAST(@dcno AS VARCHAR), 4) 

這裏是SQLFiddle演示


你的程序,可以歸結爲一個聲明

CREATE PROCEDURE K_FS_GenerateAutoDCNo 
AS 
SELECT RIGHT(REPLICATE('0', 4) + CAST(CAST(COALESCE(MAX(dcno), 0) AS INT) + 1 AS VARCHAR), 4) dcno 
    FROM 
(
    SELECT TOP 1 dcno 
    FROM K_FS_GenerateDcno 
    ORDER BY sno DESC 
) q; 

這裏是SQLFiddle演示


在那裏我加入這行..?

在你的代碼可以改變

select (@latestindent + 1) as dcno 

SELECT RIGHT(REPLICATE('0', 4) + CAST(@latestindent + 1 AS VARCHAR), 4) dcno 

注意這樣的遞增方法不是併發安全,是受競爭條件。

+0

+1我喜歡你回答更好:) – 2014-01-05 06:49:39

+0

之後第99個數字,然後發生什麼 – Sambasiva

+0

@SambaSiva'0100'我猜。你怎麼看? – peterm