SQL-запрос и хранимая процедура не дают желаемых результатов - PullRequest
1 голос
/ 01 июля 2010

У меня есть эта таблица и функция Хранимых процедур:

Таблица:

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)

ТЕПЕРЬ:

когда я делаю это:

select 
    f.Number
    ,read_and_increment()
from _Numbers f

Я получаю:

  Number-----Value

   1          0   
   2          0   
   3          0   
   4          0   

Я хочу другое значение, например (0,1,2,3) - что мне нужно сделать, чтобы достичь этого?

Я понимаю, что получаю одинаковые значения из-за единственного выбора, но не уверен, что мне нужно сделать, чтобы получить то, что мне нужно в данный момент ......

Я не могу использовать IDENTITY или автоинкремент, см. мой предыдущий вопрос для более подробной информации, если вы заинтересованы ...

Спасибо

Voodoo

1 Ответ

2 голосов
/ 02 июля 2010

Попробуйте пометить вашу функцию как 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
...