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
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
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
Essayez d'appeler votre proc de cette façon:
DECLARE @UserIDout int
EXEC YOURPROC @EmailAddress = 'sdfds', @NickName = 'sdfdsfs', ..., @UserId = @UserIDout OUTPUT
SELECT @UserIDout
@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