2010-06-30 24 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