conditional if statements

  • hi

    im writing login stored procedures. im having some difficulty with my update user stored procedure. in a nutshell, the stored procedure expects 3 parameters: Username, Classification and Merchant. A user will have 3 edit boxes on the application developer's web page, the stored procedure needs to update whichever value was entered. I think i may be really confusing myself, so i turn to the pro's to help...

    please have a look at the following TSQL and advise, will be much appreciated ๐Ÿ™‚

    can be just copied and pasted, and executed ๐Ÿ˜€

    DECLARE @AppUsers TABLE(Username VARCHAR(20), Classification VARCHAR(20), Merchant VARCHAR(20), UserCreatedDate DATETIME)

    DECLARE @OldUsername VARCHAR(50)

    DECLARE @NewUsername VARCHAR(50)

    DECLARE @OldClassification VARCHAR(50)

    DECLARE @NewClassification VARCHAR(50)

    DECLARE @OldMerchant VARCHAR(50)

    DECLARE @NewMerchant VARCHAR(50)

    SET @OldUsername = 'Joe'

    SET @NewUsername = 'David'

    SET @OldClassification = ''

    SET @NewClassification = 'NewClass'

    SET @OldMerchant = ''

    SET @NewMerchant = 'NewMerchant'

    INSERT INTO @AppUsers ([Username],[Classification],[Merchant],[UserCreatedDate])

    VALUES ( 'Joe','OldClass','OldMerchant','2008-11-19 16:58:42.734' )

    SELECT * FROM @AppUsers

    IF EXISTS(SELECT * FROM [AppUsers] WHERE [Username] = @OldUsername AND @OldClassification = '' AND @OldMerchant = '')

    BEGIN

    UPDATE [AppUsers]

    SET [Username] = @NewUsername

    WHERE [Username] = @OldUsername

    END

    ELSE

    IF EXISTS(SELECT * FROM [AppUsers] WHERE [Username] = @OldUsername AND @OldClassification = '')

    BEGIN

    UPDATE [AppUsers]

    SET [Username] = @NewUsername, [Merchant] = @NewMerchant

    WHERE [Username] = @OldUsername

    AND [Classification] = @OldClassification

    END

    ELSE

    IF EXISTS(SELECT * FROM [AppUsers] WHERE [Username] = @OldUsername AND @OldMerchant = '')

    BEGIN

    UPDATE [AppUsers]

    SET [Username] = @NewUsername, [Classification] = @NewClassification

    WHERE [Username] = @OldUsername

    AND [Classification] = @OldClassification

    END

    SELECT * FROM @AppUsers

  • Have you considered writing it like this...

    [font="Courier New"]UPDATE [AppUsers]

       SET [Username] = @NewUsername

    WHERE [Username] = @OldUsername

       AND @OldClassification = ''

       AND @OldMerchant = ''

    UPDATE [AppUsers]

       SET [Username] = @NewUsername, [Merchant] = @NewMerchant

    WHERE [Username] = @OldUsername

       AND @OldClassification = ''

    UPDATE [AppUsers]

       SET [Username] = @NewUsername, [Classification] = @NewClassification

    WHERE [Username] = @OldUsername

            AND @OldMerchant = ''[/font]

    If so, then the next trick to try is like this...

    UPDATE [AppUsers]

    SET [Username] = @NewUsername,

    [Classification] = CASE WHEN @OldMerchant = '' THEN @NewClassification ELSE [Classification] END

    WHERE [Username] = @OldUsername

    --AND @OldMerchant = ''

    Cheers

    ChrisM

    โ€œWrite the query the simplest way. If through testing it becomes clear that the performance is inadequate, consider alternative query forms.โ€ - Gail Shaw

    For fast, accurate and documented assistance in answering your questions, please read this article.
    Understanding and using APPLY, (I) and (II) Paul White
    Hidden RBAR: Triangular Joins / The "Numbers" or "Tally" Table: What it is and how it replaces a loop Jeff Moden

  • thanks

  • You're welcome. Does it work now? If so, it would be beneficial to post your completed query here - you never know when someone else is going to come up with a similar problem. This particular problem is not uncommon.

    Cheers

    ChrisM

    โ€œWrite the query the simplest way. If through testing it becomes clear that the performance is inadequate, consider alternative query forms.โ€ - Gail Shaw

    For fast, accurate and documented assistance in answering your questions, please read this article.
    Understanding and using APPLY, (I) and (II) Paul White
    Hidden RBAR: Triangular Joins / The "Numbers" or "Tally" Table: What it is and how it replaces a loop Jeff Moden

  • I'm thinking something like this should also work... assuming username is enforced unique.

    [font="Courier New"]UPDATE @AppUsers

    SET    UserName = COALESCE(@NewUserName, UserName),

                Classification = COALESCE(@NewClassification,Classification),

                Merchant = COALESCE(@NewMerchant,Merchant)

        WHERE UserName = @OldUserName[/font]

    The quirk of this method is that you can't ever replace an existing Value with a NULL value. This can be handled as well if you need to update something to NULL.

    Here's an example of this applied to your setup:

    [font="Courier New"]DECLARE @AppUsers TABLE(Username VARCHAR(20), Classification VARCHAR(20), Merchant VARCHAR(20), UserCreatedDate DATETIME)

    DECLARE @OldUsername VARCHAR(50)

    DECLARE @NewUsername VARCHAR(50)

    DECLARE @OldClassification VARCHAR(50)

    DECLARE @NewClassification VARCHAR(50)

    DECLARE @OldMerchant VARCHAR(50)

    DECLARE @NewMerchant VARCHAR(50)

    INSERT INTO @AppUsers ([Username],[Classification],[Merchant],[UserCreatedDate])

    SELECT 'Joe','OldClass','OldMerchant','2008-11-19 16:58:42.734' UNION ALL

    SELECT 'Mike','OldClass2','OldMerchant2','2008-11-19 16:58:42.734' UNION ALL

    SELECT 'Steve','OldClass3','OldMerchant3','2008-11-19 16:58:42.734' UNION ALL

    SELECT 'Bob','OldClass4','OldMerchant4','2008-11-19 16:58:42.734' UNION ALL

    SELECT 'Ted','OldClass5','OldMerchant5','2008-11-19 16:58:42.734'

    SELECT * FROM @AppUsers

    SET @OldUsername = 'Joe'

    SET @NewUsername = 'David'

    SET @OldClassification = ''

    SET @NewClassification = 'NewClass'

    SET @OldMerchant = ''

    SET @NewMerchant = 'NewMerchant'

    UPDATE @AppUsers

    SET    UserName = COALESCE(@NewUserName, UserName),

       Classification = COALESCE(@NewClassification,Classification),

       Merchant = COALESCE(@NewMerchant,Merchant)

    WHERE UserName = @OldUserName

    SET @OldUsername = 'Steve'

    SET @NewUsername = 'NotSteve'

    SET @OldClassification = ''

    SET @NewClassification = 'NewClass2'

    SET @OldMerchant = ''

    SET @NewMerchant = NULL --This won't actually do anything.

    UPDATE @AppUsers

    SET    UserName = COALESCE(@NewUserName, UserName),

       Classification = COALESCE(@NewClassification,Classification),

       Merchant = COALESCE(@NewMerchant,Merchant)

    WHERE UserName = @OldUserName

    SELECT * FROM @AppUsers   [/font]

    Seth Phelabaum


    Consistency is only a virtue if you're not a screwup. ๐Ÿ˜‰

    Links: How to Post Sample Data[/url] :: Running Totals[/url] :: Tally Table[/url] :: Cross Tabs/Pivots[/url] :: String Concatenation[/url]

  • hi Seth, you code does not compile.

    Msg 137, Level 15, State 2, Line 28

    Must declare the scalar variable "@NewUserName".

    Msg 137, Level 15, State 2, Line 41

    Must declare the scalar variable "@NewUserName".

  • found a solution. just declare a table variable with columns, UserID, Merchant and Classification

    and make necessary changes.

    DECLARE @user-id INT

    DECLARE @OldUsername VARCHAR(50)

    DECLARE @NewUsername VARCHAR(50)

    DECLARE @OldClassification VARCHAR(50)

    DECLARE @NewClassification VARCHAR(50)

    DECLARE @OldMerchant VARCHAR(50)

    DECLARE @NewMerchant VARCHAR(50)

    SET @OldUsername = 'ABC'

    SET @NewUsername = 'ABCDE'

    SET @NewClassification = ''

    SET @NewMerchant = ''

    SET @user-id =(SELECT [UserID] FROM [AppUsers] WHERE [Username] = @OldUsername)

    SET @OldMerchant =(SELECT Merchant FROM [AppUsers] WHERE [Username] = @OldUsername)

    SET @OldClassification =(SELECT [Classification] FROM [AppUsers] WHERE [Username] = @OldUsername)

    UPDATE

    [AppUsers]

    SET

    [Username] = @NewUsername,

    [Classification] =CASE WHEN @NewClassification = ''THEN @OldClassification ELSE @NewClassification END,

    Merchant =CASE WHEN @NewMerchant = ''THEN @OldMerchantELSE @NewMerchant END

    WHERE

    [Username] = @OldUsername

    SELECT * FROM [AppUsers]

  • yisaaacs (11/19/2008)


    hi Seth, you code does not compile.

    Msg 137, Level 15, State 2, Line 28

    Must declare the scalar variable "@NewUserName".

    Msg 137, Level 15, State 2, Line 41

    Must declare the scalar variable "@NewUserName".

    yisaaacs, this looks like case-sensitivity.

    โ€œWrite the query the simplest way. If through testing it becomes clear that the performance is inadequate, consider alternative query forms.โ€ - Gail Shaw

    For fast, accurate and documented assistance in answering your questions, please read this article.
    Understanding and using APPLY, (I) and (II) Paul White
    Hidden RBAR: Triangular Joins / The "Numbers" or "Tally" Table: What it is and how it replaces a loop Jeff Moden

  • yip. got it to compile.

    but i found a better way, as my previous post.

    thanks guys

  • yisaaacs (11/20/2008)


    yip. got it to compile.

    but i found a better way, as my previous post.

    thanks guys

    [font="Courier New"]SET @UserID =                        (SELECT [UserID] FROM [AppUsers] WHERE [Username] = @OldUsername)

    SET @OldMerchant =                (SELECT Merchant FROM [AppUsers] WHERE [Username] = @OldUsername)        

    SET @OldClassification =(SELECT [Classification] FROM [AppUsers] WHERE [Username] = @OldUsername)                        

    UPDATE [AppUsers] SET

       [Username] = @NewUsername,

       [Classification] = CASE WHEN @NewClassification = '' THEN @OldClassification ELSE @NewClassification END,

            Merchant = CASE WHEN @NewMerchant = '' THEN @OldMerchant ELSE @NewMerchant END

    WHERE [Username] = @OldUsername

    -- functionally the same, but three less SELECTs, two less variables.

    UPDATE [AppUsers] SET

       [Username] = @NewUsername,

       [Classification] = CASE WHEN @NewClassification = '' THEN [Classification] ELSE @NewClassification END,

            Merchant = CASE WHEN @NewMerchant = '' THEN Merchant ELSE @NewMerchant END

    WHERE [Username] = @OldUsername

    [/font]

    Cheers

    ChrisM

    โ€œWrite the query the simplest way. If through testing it becomes clear that the performance is inadequate, consider alternative query forms.โ€ - Gail Shaw

    For fast, accurate and documented assistance in answering your questions, please read this article.
    Understanding and using APPLY, (I) and (II) Paul White
    Hidden RBAR: Triangular Joins / The "Numbers" or "Tally" Table: What it is and how it replaces a loop Jeff Moden

Viewing 10 posts - 1 through 10 (of 10 total)

You must be logged in to reply to this topic. Login to reply