2013-11-25 67 views
-3

我需要創建一個函數或存儲過程,它將生成一個數字序列 - 1,2,3 ....它應該能夠記住上次調用時生成的數字。例如,我只做了它,然後調用它10次。最後一代= 10.我停止DB並關閉計算機。下一次我運行這個功能,它應該會生成11.一種創建數字序列生成器的方法?

有人可以建議我怎麼做到這一點?

謝謝。

+2

你現在做了什麼?你面臨的問題是什麼,或者你如何考慮這樣做,只是張貼更多的東西,所以我們可以袒護你.. – CaveCoder

+1

你到目前爲止嘗試過什麼?你至少需要證明你所問的問題的一些知識。 – logixologist

+0

@logixologist - 我是SQL新手在這種情況下,我無法弄清楚任何代碼。我只是需要一些提示開始並自行解決。 –

回答

4

像史蒂夫芬頓解釋標識列去爲這種需求的方式,但如果你需要創建一個序列號,您需要做兩件事情

1 - 創建一個表,將保存所有創建的序列號碼的記錄,因爲存儲過程無法爲您執行此操作。
2 - 創建一個存儲過程爲表,爲你這樣的事情產生的數字...

CREATE TABLE Number (Nums INT) 
GO 

存儲過程

CREATE PROCEDURE NumberGenerator 
@NumberOfNumber INT 
AS 
BEGIN 
    DECLARE @MaxNum INT 
    DECLARE @Inc INT 
    SELECT @MaxNum = MAX(Nums) FROM Number 

    IF (@MaxNum IS NULL) 
    BEGIN 
    SET @MaxNum = 0 
    END 

    SET @Inc = 1 

    WHILE (@NumberOfNumber > 0) 
    BEGIN 
     INSERT INTO Number (Nums) 
     VALUES (@MaxNum + @Inc) 

     SET @Inc = @Inc +1 
     SET @NumberOfNumber = @NumberOfNumber -1 
    END 

    SELECT Nums FROM Number 
    WHERE Nums > @MaxNum 
END 

檢索生成的值

CREATE TABLE #table (Number INT) 

INSERT INTO #table (Number) 
EXECUTE NumberGenerator @NumberOfNumber = ??? --<-- Number of values you want to generate 

SELECT * FROM #table 
+0

我執行exec NumberGenerator'20'時出現錯誤。消息208,級別16,狀態1,過程編號生成器,行13 無效的對象名稱'數字'。 –

+0

@ Trojan.ZBOT現在嘗試在插入語句中對錶名添加了's',並接受答案(如果有幫助)。 –

+0

@ Trojan.ZBOT當你傳遞參數'20'時,你傳遞一個字符串,它需要INT參數,傳遞沒有單引號的值。 –

2

這聽起來像是SQL標識列的理想用法,默認情況下每次添加行時都會自動遞增一。如果您正在考慮使用您的函數爲您的行生成Id編號,則應該查看標識列。

如果你真的需要一個數字發生器,你可以在一個序列表中存儲一行,並在一個事務中讀取它,增加它並保存。

+1

這聽起來像是(SQL Server)標識列的可怕使用。標識列不是密集的序列。 (這個問題一般都沒有提到PK的用法:「我需要做一個函數或存儲過程,它會產生一個數字序列」。) – user2864740

+0

我認爲你誤解了 - 我的建議是,如果數字正在生成作爲Id使用,請使用標識列。第二句描述如何將數字存儲在表中以保存最後的值並手動遞增序列並返回它。 – Fenton

+1

@SteveFenton太糟糕了,你不能投下評論。對於一個非常糟糕的問題,你有一個完全合法的答案。 – logixologist