web-dev-qa-db-fra.com

Valeur de retour dans la procédure stockée SQL Server

J'ai une procédure stockée qui contient une instruction if. Si le nombre de lignes comptées est supérieur à 0, il doit définir le seul paramètre de sortie @UserId à 0

Cependant, il ne renvoie qu'une valeur dans la deuxième partie de la requête.

@EmailAddress varchar(200),
@NickName varchar(100),
@Password varchar(150),
@Sex varchar(50),
@Age int,
@EmailUpdates int,
@UserId int OUTPUT
IF 
    (SELECT COUNT(UserId) FROM RegUsers WHERE EmailAddress = @EmailAddress) > 0
    BEGIN
        SET @UserId = 0
    END
ELSE
    BEGIN
        INSERT INTO RegUsers (EmailAddress,NickName,PassWord,Sex,Age,EmailUpdates) VALUES (@EmailAddress,@NickName,@Password,@Sex,@Age,@EmailUpdates)
        SELECT SCOPE_IDENTITY()
    END

END
12
andrew slaughter

Vous pouvez effectuer l'une des opérations suivantes:

Changement:

SET @UserId = 0 à SELECT @UserId

Cela renverra la valeur de la même manière que votre 2e partie de l'instruction IF.


Ou, comme @UserId est défini comme sortie, modifiez:

SELECT SCOPE_IDENTITY() à SET @UserId = SCOPE_IDENTITY()


Cela dépend de la façon dont vous souhaitez accéder aux données par la suite. Si vous souhaitez que la valeur soit dans votre jeu de résultats, utilisez SELECT. Si vous souhaitez accéder à la nouvelle valeur du paramètre @UserId par la suite, utilisez SET @UserId


Étant donné que vous acceptez la 2e condition comme étant correcte, la requête que vous pouvez écrire (sans avoir à modifier quoi que ce soit en dehors de cette requête) est:

@EmailAddress varchar(200),
@NickName varchar(100),
@Password varchar(150),
@Sex varchar(50),
@Age int,
@EmailUpdates int,
@UserId int OUTPUT
IF 
    (SELECT COUNT(UserId) FROM RegUsers WHERE EmailAddress = @EmailAddress) > 0
    BEGIN
        SELECT 0
    END
ELSE
    BEGIN
        INSERT INTO RegUsers (EmailAddress,NickName,PassWord,Sex,Age,EmailUpdates) VALUES (@EmailAddress,@NickName,@Password,@Sex,@Age,@EmailUpdates)
        SELECT SCOPE_IDENTITY()
    END

END
7
Curt

Je peux recommander de faire un pré-init de la future valeur d'index, c'est très utile dans beaucoup de cas comme le multi-travail, certains exportent e.t.c.

créez simplement une table User_Seq supplémentaire: avec deux champs: id Uniq index et SeqVal nvarchar(1)

et créer le prochain SP, et généré une valeur d'ID à partir de ce SP et placé dans une nouvelle ligne utilisateur!

CREATE procedure [dbo].[User_NextValue]
as
begin
    set NOCOUNT ON


    declare @existingId int = (select isnull(max(UserId)+1, 0)  from dbo.User)

    insert into User_Seq (SeqVal) values ('a')
    declare @NewSeqValue int = scope_identity()     

    if @existingId > @NewSeqValue 
    begin  

        set identity_insert User_Seq  on
        insert into User_Seq (SeqID) values (@existingId)     
        set @NewSeqValue = scope_identity()     
    end

    delete from User_Seq WITH (READPAST)

return @NewSeqValue

end
3
Arbejdsglæde

Essayez d'appeler votre proc de cette façon:

DECLARE @UserIDout int

EXEC YOURPROC @EmailAddress = 'sdfds', @NickName = 'sdfdsfs', ..., @UserId = @UserIDout OUTPUT

SELECT @UserIDout 
2
Andrey Gurinov
@EmailAddress varchar(200),
@NickName varchar(100),
@Password varchar(150),
@Sex varchar(50),
@Age int,
@EmailUpdates int,
@UserId int OUTPUT
DECLARE @AA INT
SET @AA=(SELECT COUNT(UserId) FROM RegUsers WHERE EmailAddress = @EmailAddress)

IF @AA> 0
    BEGIN
        SET @UserId = 0
    END
ELSE
    BEGIN
        INSERT INTO RegUsers (EmailAddress,NickName,PassWord,Sex,Age,EmailUpdates) VALUES (@EmailAddress,@NickName,@Password,@Sex,@Age,@EmailUpdates)
        SELECT SCOPE_IDENTITY()
    END

END
0
KEERTHANA