alybaba726
alybaba726

Reputation: 400

SQL Server stored procedure multiple IF statements

I have a SQL Server stored procedure with three conditions. Currently, only the first IF block will execute no matter the parameters:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO

/*
DESCRIPTION: Assigns/reassigns orders in [GIS].[dbo].[QCOrders]
PARAMETERS:
    @FldrInitKey    VARCHAR(30) = NULL,
    @UserName       VARCHAR(20) = NULL,
    @QCTrack        DECIMAL(6,2),
    @WF             BIT,
    @idQC           INT         = NULL
RETURNS:
    @RC 0 (success), 1 (failure)
EXAMPLE:
    EXEC spQCAssignOrders '889G1Pt', 'arajendran', '2016.10', '0', NULL
MODIFICATIONS:
    03/10/2016  A.Rajendran Created
*/

ALTER PROCEDURE [dbo].[spQCAssignOrders]
    @FldrInitKey VARCHAR(30) = NULL,
    @UserName    VARCHAR(20) = NULL,
    @QCTrack     DECIMAL(6,2),
    @WF          BIT,
    @idQC        INT = NULL
AS
    SET NOCOUNT ON
    SET ROWCOUNT 0
    SET XACT_ABORT ON

BEGIN TRY
    /* Declare and initialize variables */
    DECLARE @RC INT, @TranCount INT

    SELECT 
        @RC = 0, @TranCount = @@TRANCOUNT

    IF @TranCount = 0 
    BEGIN TRANSACTION
        IF @idQC IS NOT NULL
        BEGIN
            UPDATE [GIS].[dbo].[QCOrders]
            SET UserName = @UserName,
                AssignedDte = CASE  
                                 WHEN @UserName IS NULL 
                                    THEN NULL
                                    ELSE GETDATE()
                              END,
                Unable = NULL,
                Error = NULL,
                CompletedDate = NULL,
                AdminCheck = NULL
            WHERE 
                idQC = @idQC
        END

        IF @FldrInitKey IS NOT NULL
        BEGIN
            UPDATE [GIS].[dbo].[QCOrders]
            SET UserName = @UserName,
                AssignedDte = GETDATE()
            WHERE   
                QCTrack = @QCTrack
                AND FldrInitKey = @FldrInitKey
                AND WellsFargo = @WF
                AND UserName IS NULL
                AND Unable <> 1
        END

        IF @FldrInitKey IS NULL
        BEGIN
            UPDATE [GIS].[dbo].[QCOrders]
            SET UserName = @UserName,
                AssignedDte = GETDATE()
            WHERE   
                QCTrack = @QCTrack
                AND WellsFargo = @WF
                AND UserName IS NULL
                AND Unable <> 1
        END

        IF @TranCount = 0 AND (XACT_STATE()) = 1 
           COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
        IF (XACT_STATE()) = -1 
            ROLLBACK TRANSACTION

        EXEC [TOD].[dbo].[spRethrowError]
        SET @RC = 1
    END CATCH

    SET NOCOUNT OFF
    SET ROWCOUNT 0

    RETURN @RC


GRANT EXECUTE ON [GIS].[dbo].[spQCAssignOrders] TO db_allowexec

If I want to execute this:

EXEC spQCAssignOrders '889G1Pt', 'arajendran', '2016.10', '0', NULL

the second IF statement should execute, but it doesn't. Why?

Clarification

Second IF statement:

IF @FldrInitKey IS NOT NULL
BEGIN
    UPDATE [GIS].[dbo].[QCOrders] 
    SET UserName = @UserName,
        AssignedDte = GETDATE()
    WHERE  
        QCTrack = @QCTrack
        AND FldrInitKey = @FldrInitKey
        AND WellsFargo = @WF
        AND UserName IS NULL
        AND Unable <> 1
END

Upvotes: 2

Views: 998

Answers (1)

Sean Lange
Sean Lange

Reputation: 33581

You could greatly simplify this. All three update statements can be turned into a single update statement. This should be the equivalent of all three.

UPDATE [GIS].[dbo].[QCOrders]
                SET 
                    UserName    = @UserName,
                    AssignedDte = 
                    CASE    
                        WHEN @idQC IS NOT NULL and @UserName IS NULL THEN NULL
                        ELSE GETDATE()
                    END

            WHERE   QCTrack         = @QCTrack
                    AND FldrInitKey = ISNULL(@FldrInitKey, FldrInitKey)
                    AND WellsFargo  = @WF
                    AND UserName IS NULL
                    AND Unable <> 1

Upvotes: 1

Related Questions