2016-02-14 75 views
2

此過程不返回2,它總是返回1.如何在插入發生時返回1,並在發生更新時返回2? 這是完全插入和更新,但返回的值始終爲1如何在SQL Server 2008的單個存儲過程中插入並返回2後返回1

CREATE PROCEDURE [dbo].[sp_SaveEmployeeDetails] 
    @employeeID int 
    ,@first_name varchar(255) 
    ,@middle_name varchar(255) 
    ,@last_name varchar(255) 
    ,@gender varchar(255) 
    ,@date_of_birth date 
    ,@EntryBy varchar(255) 
    --,@ActionStatus int = NULL OUTPUT 
AS 
BEGIN 
    SET NOCOUNT OFF; 

    DECLARE @ActionStatus int; 

    IF NOT EXISTS(Select * From employees 
        Where employeeID [email protected]) 
    BEGIN 
     INSERT INTO [dbo].[employees] ([first_name], [middle_name], [last_name], [gender], [date_of_birth], [EntryBy], [EntryDate]) 
     VALUES (@first_name, @middle_name, @last_name, @gender, @date_of_birth, @EntryBy, getdate()) 

     SET @ActionStatus = 1; 
    END 
    ELSE 
    BEGIN 
     UPDATE employees 
     SET [first_name] = @first_name, 
      [middle_name] = @middle_name, 
      [last_name] = @last_name, 
      [gender] = @gender, 
      [date_of_birth] = @date_of_birth, 
      [EntryBy] = @EntryBy, 
      [EntryDate] = getdate() 
     WHERE 
      employeeID = @employeeID 

     SET @ActionStatus = 2; 
    END 

    RETURN @ActionStatus; 
    --also try SELECT @ActionStatus; 
END 
+1

當我寫了我的答案,問題是有點不同......你怎麼稱呼這個?你如何檢索返回值?你確定,ELSE部分已經到達嗎?員工是否更新以防員工存在?還有一個提示。你可能會想到'MERGE'語句。 – Shnugo

+0

備註:您應該**不要**爲存儲過程使用'sp_'前綴。微軟已經保留了這個前綴以供自己使用(參見*命名存儲過程*)](http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx),以及你將來有可能冒着名字衝突的風險。 [這對你的存儲過程性能也是不利的](http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix)。最好只是簡單地避免使用'sp_'並將其他內容用作前綴 - 或者根本沒有前綴! –

+0

你能提供一個例子,你如何檢查程序的結果 –

回答

1

的價值,你回到這裏

RETURN @ActionStatus; 

...可能直接被設置爲一個變量,其過程的「自己」迴歸值。看看這個例子:

CREATE PROCEDURE dbo.TestReturn(@IntValue INT) 
AS 
BEGIN 
    IF @IntValue=0 
     RETURN 0; 
    ELSE 
     RETURN 1; 
END 
GO 

DECLARE @RetVal INT; 
EXEC @RetVal = dbo.TestReturn -1; 
SELECT @RetVal; 

EXEC @RetVal = dbo.TestReturn 0; 
SELECT @RetVal; 

EXEC @RetVal = dbo.TestReturn 1; 
SELECT @RetVal; 

GO 

DROP PROCEDURE dbo.TestReturn; 

它按照預期回到了1-0-1。

但這返回值被綁定到INT,其目的是反映執行狀態(如錯誤代碼,成功級......)你的情況,這似乎是如此......

如果你仔細想想任何其他數據的輸出使用OUTPUT參數。

CREATE PROCEDURE dbo.TestReturn(@IntValue INT, @TestPrm VARCHAR(100) OUTPUT) 
AS 
BEGIN 
    IF @IntValue=0 
    BEGIN 
     SET @TestPrm='Value was 0' 
     RETURN 0; 
    END 
    ELSE 
    BEGIN 
     SET @TestPrm='Value was something else'; 
     RETURN 1; 
    END 
END 
GO 

DECLARE @RetVal INT; 
DECLARE @RetVarchar VARCHAR(100); 

EXEC @RetVal = dbo.TestReturn -1,@RetVarchar OUTPUT; 
SELECT @RetVal,@RetVarchar; 

EXEC @RetVal = dbo.TestReturn 0,@RetVarchar OUTPUT; 
SELECT @RetVal,@RetVarchar; 

EXEC @RetVal = dbo.TestReturn 1,@RetVarchar OUTPUT; 
SELECT @RetVal,@RetVarchar; 

GO 

DROP PROCEDURE dbo.TestReturn; 
+0

成功插入和更新操作,但總是返回1 –

+0

@OsmanGoni你打電話給你的SP? – Shnugo

+0

@OsmanGoni,只是添加了一些例子來顯示返回值和輸出參數的用法 – Shnugo

相關問題