2010-06-30 40 views
1

我有這個表和存儲過程功能:SQL查詢和存儲過程沒有產生預期的效果

表:

CREATE TABLE _DMigNumbers(
    Number numeric(20,0) NOT NULL PRIMARY KEY 
); 
INSERT INTO _DMigNumbers VALUES(0) 

存儲過程的功能:

CREATE FUNCTION read_and_increment() 
RETURNS NUMERIC(20,0) 
BEGIN 
    DECLARE @number_just_read NUMERIC(20,0); 

     SELECT number INTO @number_just_read 
     FROM _DMigNumbers; 

     UPDATE _DMigNumbers 
     SET number = number + 1; 
    RETURN @number_just_read; 
End 

,我創建這個號碼錶以及

CREATE TABLE _Numbers (
    Number int NOT NULL PRIMARY KEY 
); 
INSERT INTO _Numbers VALUES(1) 
INSERT INTO _Numbers VALUES(2) 
INSERT INTO _Numbers VALUES(3) 
INSERT INTO _Numbers VALUES(4) 

NOW:

當我這樣做:

select 
    f.Number 
    ,read_and_increment() 
from _Numbers f 

我得到:

 
    Number-----Value 

    1   0 
    2   0 
    3   0 
    4   0 

我要像不同的值(0,1,2,3) - 什麼做我需要做的爲了達成這個?

我明白,我正在因爲單選擇的值相同,但不知道什麼,我需要做的就是我所追求的那一刻......

我不能用IDENTITY或自動增量看到my previous question for more details if interested...

感謝,

巫毒

+0

這似乎是巫術編程。 afaik,這是我第一次在SO – Hao 2010-07-01 00:18:05

+0

這裏看到過那種查詢(在做select的時候更新)問題。根據另一篇文章的接受答案,它看起來像缺少一個提交語句。這是否會在Sybase中自動發生? – 2010-07-01 03:16:05

+0

我沒有訪問Sybase的權限,所以我無法運行該代碼。但是在SQL Server中,你不能創建這樣的函數,你會得到這樣的錯誤:'函數中'UPDATE'中的副作用或時間依賴運算符的使用無效。'我不知道你是如何' d在Sybase中執行此操作。 – 2010-07-01 12:52:00

回答

2

嘗試標記你的函數爲NOT DETERMINISTIC,看看有沒有什麼幫助。默認情況下,所有函數都是確定性的,這意味着數據庫服務器可以在某些情況下緩存結果。以這種方式標記將強制服務器每次重新評估查詢/函數。

CREATE FUNCTION read_and_increment() 
RETURNS NUMERIC(20,0) 
NOT DETERMINISTIC 
BEGIN 
    DECLARE @number_just_read NUMERIC(20,0); 

     SELECT number INTO @number_just_read 
     FROM _DMigNumbers; 

     UPDATE _DMigNumbers 
     SET number = number + 1; 
    RETURN @number_just_read; 
End 
+1

DUDE,這只是輝煌,它似乎已經奏效。我希望我能給你一個+100。驚人! – VoodooChild 2010-07-02 02:20:09

+0

只想說這對我有用,非常感謝 - 非常感謝幫助! – VoodooChild 2010-07-02 03:11:51