2012-03-23 20 views
7

Tengo un procedimiento almacenado que tiene una instrucción if. Si el número de filas contadas es mayor que 0, entonces debe establecer el único parámetro de salida @UserId en 0Valor devuelto en el procedimiento almacenado de SQL Server

Sin embargo, solo devuelve un valor en la segunda parte de la consulta.

@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 
+1

¿Qué quiere decir con "devuelve un valor en la segunda parte de la pregunta"? El parámetro de salida no se devolverá como un conjunto de registros –

Respuesta

5

Puede hacerlo 1 de los siguientes:

Cambio:

SET @UserId = 0 a SELECT @UserId

Esto devolverá el valor de la misma manera que su segunda parte de la SI declaración es.


O, ya que @IDUsuario se establece como una salida, cambie:

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


Depende de cómo desea acceder a los datos después. Si desea que el valor esté en su conjunto de resultados, use SELECT. Si desea acceder al nuevo valor del parámetro @IDUsuario después, a continuación, utilizar SET @UserId


En vista de que usted está aceptando la segunda condición correcta, la consulta que podría escribir (sin tener que cambiar nada fuera de esta consulta) es:

@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 
+0

Hola He intentado configurar la segunda parte para configurar el @UserId pero eso tampoco funcionó –

+0

@andrewslaughter Ver mi edición. Ambas condiciones ahora usan 'SELECT', que devolverá un valor en su conjunto de resultados. En cuanto a su pregunta, parece que así es como está accediendo al valor de esta consulta – Curt

+0

SELECCIONAR 0 funciona de maravilla, gracias –

0

intenta llamar a su proc de esta manera:

DECLARE @UserIDout int 

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

SELECT @UserIDout 
+0

@AndreyGurinov No veo cómo esto solucionaría el problema .. UserId seguirá siendo NULL para la 2da condición. – Curt

+0

Hola gracias por que Si ExecuteStoredProcedure desde el explorador de objetos y poner los parámetros de la primera vez que lo ejecuto, me meto en el panel de resultados (sin nombre de la columna) 64 (este es el ID de inserción) & UserId NULL valor de retorno 0 si yo corro de nuevo apenas consigo & UserId 0 valor de retorno 0 –

1

puedo recomendar realizar previo de inicio de un futuro valor del índice, esto es muy útil en muchos casos como trabajo múltiple, algunos exportan e.t.c.

acaba de crear User_Seq tabla adicional: con dos campos: id Uniq index y SeqVal nvarchar(1)

y crear junto SP, y genera valor de ID de esta SP y poner a nueva fila del usuario!

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 
0
@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 
Cuestiones relacionadas