【问题标题】:Stored Procedure return values by comparison of 2 fields存储过程通过比较 2 个字段返回值
【发布时间】:2015-07-10 06:16:33
【问题描述】:

我有一个包含 3 列的表 USERIDOLDPASSWORDNEWPASSWORD

我想通过USERID 选择OLDPASSWORDNEWPASSWORD 列并比较OLDPASSWORDNEWPASSWORD,如果NEWPASSWORDOLDPASSWORD 相等,它应该返回NEWPASSWORD,否则返回 0(字符串);

有点像这样:

ALTER PROCEDURE [dbo].[GET_PASSWORD]
(
    @USERID NVARCHAR(50)
)
AS
     SELECT OLDPASSWORD, NEWPASSWORD 
     FROM PASSWORDINFO 
     WHERE USERID = @USERID

     IF OLDPASSWORD == NEWPASSWORD 
        RETURN "0" 
     ELSE 
        RETURN NEWPASSWORD

感谢您的帮助。

【问题讨论】:

  • 您是否尝试过使用 CASE WHEN 语句?
  • @Robert Harvey 我想他想比较新旧密码并返回比较结果..

标签: c# sql database stored-procedures


【解决方案1】:

Return 关键字不是为从表中返回值而设计的。 Return 关键字用于从存储过程返回,它只能返回整数值。在这里,您可以返回一些执行 proc 的代码结果。您应该直接使用select 声明或使用output parameter

ALTER PROCEDURE [dbo].[GET_PASSWORD] @USERID NVARCHAR(50)
AS
    BEGIN
        SELECT  CASE WHEN OLDPASSWORD = NEWPASSWORD THEN '0'
                     ELSE NEWPASSWORD
                END AS CurrentPassword
        FROM    PASSWORDINFO
        WHERE   USERID = @USERID
    END

或者:

ALTER PROCEDURE [dbo].[GET_PASSWORD]
    @USERID NVARCHAR(50) ,
    @CurrentPassword NVARCHAR(50) OUTPUT
AS
    BEGIN
        SELECT  @CurrentPassword = CASE WHEN OLDPASSWORD = NEWPASSWORD
                                        THEN '0'
                                        ELSE NEWPASSWORD
                                   END
        FROM    PASSWORDINFO
        WHERE   USERID = @USERID
    END

【讨论】:

  • 这是更有效的解决方案。更少的代码,做更多的事情。 :) 谢谢!
【解决方案2】:

你试过了吗:

ALTER PROCEDURE [dbo].[GET_PASSWORD]
(
    @USERID NVARCHAR(50)
)
AS
BEGIN

    SELECT
        CASE
            WHEN OLDPASSWORD = NEWPASSWORD THEN '0'
            ELSE NEWPASSWORD
         END
    FROM PASSWORDINFO
    WHERE USERID = @USERID

END

【讨论】:

    【解决方案3】:

    你需要这样的东西:

       SELECT CASE WHEN OLDPASSWORD = NEWPASSWORD THEN '0' 
       ELSE NEWPASSWORD END AS Result 
       FROM PASSWORDINFO WHERE USERID = @USERID
    

    【讨论】:

      【解决方案4】:
      ALTER PROCEDURE [dbo].[GET_PASSWORD] (@USERID NVARCHAR(50), @result VARCHAR(10) OUTPUT)
      AS
      BEGIN
          SELECT @result = CASE 
                  WHEN OLDPASSWORD = NEWPASSWORD
                      THEN '1'
                  ELSE '0'
                  END
          FROM PASSWORDINFO
          WHERE UserId = @USERID
      END
      

      【讨论】:

        【解决方案5】:

        使用返回值返回多个值是不可能的,其中作为输出参数,可以返回任何数据类型,并且 sp 可以有多个输出参数。我总是更喜欢使用输出参数而不是 RETURN 值。

        一般情况下,RETURN 值用于表示存储过程的成功或失败,尤其是在我们处理嵌套存储过程时。返回值 0 表示成功,任何非零值都表示失败。

        ALTER PROCEDURE [dbo].[GET_PASSWORD]
            @USERID NVARCHAR(50) ,
            @Password NVARCHAR(50) OUTPUT
        AS
            BEGIN
                SELECT  @Password  = CASE WHEN OLDPASSWORD = NEWPASSWORD
                                        THEN '0'
                                          ELSE NEWPASSWORD
                                        END
                FROM    PASSWORDINFO
                WHERE   USERID = @USERID
            END
        

        【讨论】:

          【解决方案6】:
          // try this
          ALTER PROCEDURE [dbo].[GET_PASSWORD]
          (
              @USERID NVARCHAR(50)
          )
          AS
              declare   @NewPassword NVARCHAR(50)
               declare   @OldPassword NVARCHAR(50)
          
               SELECT  @OldPassword =OLDPASSWORD, @NewPassword = NEWPASSWORD 
               FROM PASSWORDINFO 
               WHERE USERID = @USERID    
          
               IF @OldPassword = @NewPassword 
                  RETURN "0" 
               ELSE 
                  RETURN @NewPassword 
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-10-20
            • 2019-01-16
            • 1970-01-01
            • 2010-11-02
            相关资源
            最近更新 更多