2010-06-30 3 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) 

СЕЙЧАС:

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

select 
    f.Number 
    ,read_and_increment() 
from _Numbers f 

я получаю:

 
    Number-----Value 

    1   0 
    2   0 
    3   0 
    4   0 

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

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

Я не могу использовать IDENTITY или автоинкремент см my previous question for more details if interested...

Спасибо,

Voodoo

+0

Это похоже на программирование вуду. afaik, это первый раз, когда я видел такой запрос (обновление при выполнении select) здесь в SO – Hao

+0

На основании принятого ответа от другого сообщения, похоже, что вам не хватает инструкции commit. Это происходит автоматически в Sybase? –

+0

У меня нет доступа к Sybase, поэтому я не могу запустить этот код. Однако в SQL Server вы не можете сделать такую ​​функцию, вы получите ошибку: «Недопустимое использование побочного эффекта или зависящего от времени оператора в« UPDATE »внутри функции.« Я не уверен, d сделать это в Sybase. –

ответ

2

Try испачкать функцию как 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

+0

Просто хочу сказать, что это работало для меня, большое спасибо - очень ценю помощь !!! – VoodooChild

Смежные вопросы