2012-03-23 113 views
7

我有一個存儲過程,其中包含if語句。如果計數的行數大於0,則應該將唯一的輸出參數@UserId設置爲0SQL Server存儲過程中的返回值

但是,它只返回查詢的第二部分中的值。

@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

你是什麼意思「在查詢的第二部分返回值」是什麼意思?輸出參數不會作爲記錄集返回 – 2012-03-23 10:23:10

回答

5

你可以做以下的1:

變化:

SET @UserId = 0至SELECT @UserId

這會以同樣的方式返回值的IF你的第二部分聲明是。


或者,看到@UserId被設置爲輸出,變更:

SELECT SCOPE_IDENTITY()SET @UserId = SCOPE_IDENTITY()


這取決於你想怎樣就可以訪問數據。如果您希望該值位於結果集中,請使用SELECT。如果你想就可以訪問@UserId參數的新值,然後用SET @UserId


看到,因爲你要接受第二條件是正確的,查詢你可以寫(無需外部改變什麼這個查詢)是:

@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

嗨我試圖設置第二部分設置@UserId但沒有工作要麼 – 2012-03-23 10:56:12

+0

@andrewslaughter請參閱我的編輯。兩種情況現在都使用'SELECT',它將在結果集中返回一個值。看看你的問題,似乎你是如何訪問這個查詢的值 – Curt 2012-03-23 11:10:52

+0

SELECT 0很好,謝謝 – 2012-03-23 13:38:40

0

嘗試打電話給你的PROC這樣:

DECLARE @UserIDout int 

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

SELECT @UserIDout 
+0

@AndreyGurinov我不明白這將如何解決這個問題.. UserId仍然是NULL的第二個條件。 – Curt 2012-03-23 10:41:31

+0

嗨感謝您的 如果我在對象資源管理器ExecuteStoredProcedure,把參數 我第一次運行它,我得到的結果窗格 (沒有列名)64(這是最後插入用戶ID ) &用戶ID NULL 返回值0 如果我再運行我只是得到 &用戶ID 0 返回值爲0 – 2012-03-23 10:57:59

1

我可以推薦使未來的指標值的預初始化,這在很多情況下非常有用,如多工作,某些輸出e.t.c.

剛剛創建其他User_Seq表: 有兩個領域:id Uniq indexSeqVal nvarchar(1)

,並創建下一個SP,並由此產生的SP ID值,並把新的用戶行!

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