【问题标题】:Stored Procedure in MSSQL for joining two tablesSQL中的存储过程用于连接两个表
【发布时间】:2015-11-18 16:21:16
【问题描述】:

我正在尝试编写一个存储过程来验证登录。

我有两个表,它们将保存如下给出的数据表结构。

Table : UserMaster

Userid  Password  IsActive
1111    xyz        1
2222    abc        0

Table : Userdetailes

Userid   Status  StartDate    EndDate
1111     1       2015-08-01   2015-08-24
2222     0       2015-08-01   2015-08-10

这就是将数据存储在两个表中的方式

我想写一个存储过程来查看使用join的数据

【问题讨论】:

  • 只需根据您的业务逻辑使用简单的选择查询,如果查询返回结果您可以允许用户输入,或者仅使用输出参数根据业务逻辑返回值。最好的办法是根据用户 ID 连接两个表并检查业务状况
  • 您能否帮助我提供示例,以了解如何在记住这些场景的情况下完成
  • 请标记到一个数据库,你用的是mysql还是sql server???
  • select c.* from (select a.* from UserSubscription a inner join (select * from UserMaster where IsActive=1)b on a.UserId=b.Userid)c where c.Status=1和 c.Startdate=c.Enddate 使用此示例查询,如果您需要包含任何业务逻辑,请添加更多

标签: mysql sql sql-server sql-server-2008 stored-procedures


【解决方案1】:

试试这样的.....

CREATE PROCEDURE [dbo].[uspauth]
   @LoginId        NVARCHAR(30)
  ,@ActiveStatus INT OUTPUT
AS
BEGIN
    SET NOCOUNT ON
    BEGIN TRY

        --1 - Both Active, 2 - User InActive & Package Active, 3 - User Inactive & Package Inactive , 4 - Not authosrised
        DECLARE @Username VARCHAR(40), @isAct Bit,@stat Bit   

        IF NOT EXISTS(SELECT 1 FROM UserSet where UserID = @LoginId)
          BEGIN
               RAISERROR('login does not exist',16,1)
               RETURN;
          END
        SELECT @Username = ISNULL(UserID,0), @isAct  = ISNULL(IsActive, 0) from UserSet where UserID = @LoginId)
        Select @stat = ISNULL([status],0) from Subscription where UserID = @LoginId 
                                                   and (DateOfStart <= CAST(GETDATE() as DATE) or DateOfStart is NULL) 
                                                   and (DateOfEnd   >= Cast(GETDATE() as DATE) or DateOfEnd   is NULL)

         IF (@isAct = 1 AND @stat = 1)  --1 - Both Active
           BEGIN
             SET @ActiveStatus  = 1;
           END
        ELSE IF (@isAct = 0 AND @stat = 1) -- 2 - User InActive & Package Active
           BEGIN
             SET @ActiveStatus  = 2;
           END
        ELSE IF (@isAct = 1 AND @stat = 0) -- 3 - User Active & Package Inactive
           BEGIN
             SET @ActiveStatus  = 3;
           END
        ELSE IF (@isAct = 0 AND @stat = 0) -- 4 - Not authosrised
           BEGIN
             SET @ActiveStatus  = 4;
           END

    END TRY
    BEGIN CATCH

        IF @@TRANCOUNT > 0 
            BEGIN
                ROLLBACK TRAN
            END

        EXEC uspProcErrorLog    
    END CATCH
END

【讨论】:

  • @LearningDB:如果这是解决方案,请考虑接受答案。为此,请单击答案左侧的刻度线,使其变为绿色。这就是我们在 Stack Overflow 上表示问题已在此处解决的方式。
【解决方案2】:

最后一个if else代码块可以用case expression简化:

set @status = case when @isAct = 1 and @stat = 1 then 1
                   when @isAct = 0 and @stat = 1 then 2
                   when @isAct = 1 and @stat = 0 then 3
                   when @isAct = 0 and @stat = 0 then 4 
              end

return @status

【讨论】:

    猜你喜欢
    • 2021-06-21
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多