2010-06-30 15 views
1

je cette table et la fonction stockée proc:requête SQL et la procédure stockée ne produisant pas les résultats souhaités

Tableau:

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

fonction stockée proc:

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 

et I créer cette Numbers table aussi bien

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) 

MAINTENANT:

quand je fais ceci:

select 
    f.Number 
    ,read_and_increment() 
from _Numbers f 

je reçois:

 
    Number-----Value 

    1   0 
    2   0 
    3   0 
    4   0 

Je veux autre valeur comme (0,1,2,3) - qu'est-ce que je dois faire pour y parvenir?

Je comprends que je reçois les mêmes valeurs en raison de la Unique.Sélectionnez, mais pas sûr de ce que je dois faire pour obtenir ce que je suis après au moment ......

Je ne peux pas utiliser IDENTITÉ ou autoincrement voir my previous question for more details if interested...

Merci,

Voodoo

+0

qui ressemble à de la programmation vaudou. afaik, c'est la première fois que j'ai vu ce type de requête (mise à jour en sélectionnant) question ici SO – Hao

+0

Basé sur la réponse acceptée de l'autre poste, il semble qu'il vous manque une déclaration de validation. Cela se passe-t-il automatiquement dans Sybase? –

+0

Je n'ai pas accès à Sybase, donc je ne peux pas exécuter ce code. Cependant, dans SQL Server, vous ne pouvez pas faire une telle fonction, vous obtiendrez l'erreur suivante: 'Utilisation invalide d'un effet secondaire ou d'un opérateur dépendant du temps dans 'UPDATE' dans une fonction.' Je ne sais pas comment vous ' d le faire dans Sybase. –

Répondre

2

Essayez de sélectionner votre fonction NOT DETERMINISTIC et voir si cela aide. Par défaut, toutes les fonctions sont déterministes, ce qui signifie que le serveur de base de données peut mettre en cache le résultat dans certaines circonstances. Marquer de cette façon forcera le serveur à réévaluer la requête/fonction à chaque fois.

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 qui est juste brillant, il semble avoir travaillé. L'homme J'aimerais pouvoir vous donner un +100. INCROYABLE! – VoodooChild

+0

Je veux juste dire que cela a fonctionné pour moi, merci beaucoup - vraiment apprécier l'aide !!! – VoodooChild