2016-02-14 52 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

相关问题