SQL Stored Procedure preventing to write null

后端 未结 3 1526
灰色年华
灰色年华 2021-01-29 00:08

So, I\'ve got this below implemented in one of my stored procedures. And if they have less points as specified it works correctly but if they have normal points (not less) and t

相关标签:
3条回答
  • 2021-01-29 00:27

    Switch to a CASE statement with an ELSE clause. It's more concise anyway.

    GO
    /****** Object:  StoredProcedure [dbo].[REPAIR_USER_STAT_POINTS]    Script Date: 05/30/2013 03:57:55 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    
    ALTER PROCEDURE [dbo].[REPAIR_USER_STAT_POINTS]
    @strUserID varchar(21)
    AS
    DECLARE @Level int, @Point int, @Class int,@NewPoint int, @Strong int, @Sta int, @Dex int, @Intel int, @Cha int, @Total int
    
    SELECT @Level = Level, @Class = Class, @Point = Points, @Strong = Strong, @Sta = Sta, @Dex = Dex, @Intel = Intel, @Cha = Cha 
    FROM USERDATA WHERE strUserId = @strUserID
    
    SET @Total = SUM(@Strong + @Sta + @Dex + @Intel + @Cha + @Point)
    
    
    SET @NewPoint = 
        CASE WHEN @Level = 61 AND @Total < 482 THEN 10
            WHEN @Level = 62 AND @Total < 487 THEN 15
            WHEN @Level = 63 AND @Total < 492 THEN 20
            WHEN @Level = 64 AND @Total < 497 THEN 25
            WHEN @Level = 65 AND @Total < 502 THEN 30
            WHEN @Level = 66 AND @Total < 507 THEN 35
            WHEN @Level = 67 AND @Total < 512 THEN 40
            WHEN @Level = 68 AND @Total < 517 THEN 45
            WHEN @Level = 69 AND @Total < 522 THEN 50
            WHEN @Level = 70 AND @Total < 527 THEN 55
            WHEN @Level = 71 AND @Total < 532 THEN 60
            WHEN @Level = 72 AND @Total < 537 THEN 65
            WHEN @Level = 73 AND @Total < 542 THEN 70
            WHEN @Level = 74 AND @Total < 547 THEN 75
            WHEN @Level = 75 AND @Total < 552 THEN 80
            WHEN @Level = 76 AND @Total < 557 THEN 85
            WHEN @Level = 77 AND @Total < 562 THEN 90
            WHEN @Level = 78 AND @Total < 567 THEN 95
            WHEN @Level = 79 AND @Total < 572 THEN 100
            WHEN @Level = 80 AND @Total < 577 THEN 105
            WHEN @Level = 81 AND @Total < 582 THEN 110
            WHEN @Level = 82 AND @Total < 587 THEN 115
            WHEN @Level = 83 AND @Total < 592 THEN 120
            ELSE @Point
        END
    
    
    IF @Point <> @NewPoint
    BEGIN
        IF @Class = 201 OR @Class = 205 OR @Class = 206 OR @Class = 101 OR @Class = 105 OR @Class = 106
        BEGIN
            UPDATE USERDATA Set Strong = '247',Dex = '60',Sta = '65',Intel = '50',Cha = '50',Points = @NewPoint 
            WHERE strUserId = @strUserId
        END
        ELSE IF @Class = 202 OR @Class = 207 OR @Class = 208 OR @Class = 102 OR @Class = 107 OR @Class = 108
        BEGIN
            UPDATE USERDATA Set Strong = '60',Dex = '252',Sta = '60',Intel = '50',Cha = '50',Points = @NewPoint 
            WHERE strUserId = @strUserId
        END
        ELSE IF @Class = 203 OR @Class = 209 OR @Class = 210 OR @Class = 103 OR @Class = 109 OR @Class = 110
        BEGIN
            UPDATE USERDATA Set Strong = '50',Dex = '70',Sta = '50',Intel = '70',Cha = '232',Points = @NewPoint 
            WHERE strUserId = @strUserId
        END
        ELSE IF @Class = 204 OR @Class = 211 OR @Class = 212 OR @Class = 104 OR @Class = 111 OR @Class = 112
        BEGIN
            UPDATE USERDATA Set Strong = '65',Dex = '60',Sta = '65',Intel = '232',Cha = '50',Points = @NewPoint 
            WHERE strUserId = @strUserId
        END
    END
    
    0 讨论(0)
  • 2021-01-29 00:38

    If I'm understanding this correctly you could modify the ELSE.

    Change From:

    ELSE @NewPoint = @NewPoint
    

    Change To:

    ELSE return
    

    This will abort the script and no updates will occur.

    0 讨论(0)
  • 2021-01-29 00:43

    I'm still a little confused by your question, but this should work as I understand. Instead of all the IF statements, consider moving into a single CASE statement, defaulting the value to 0. Then add a check if the value isn't 0, to do something.

    DECLARE @Level int
    DECLARE @Total int
    DECLARE @NewPoint int
    
    SET @Level = 61
    SET @Total = 100
    
    SELECT 
      @NewPoint = CASE
                    WHEN @Level = 61 AND @Total < 482 THEN 10
                    WHEN @Level = 62 AND @Total < 487 THEN 15
                    WHEN @Level = 63 AND @Total < 492 THEN 20
                    WHEN @Level = 64 AND @Total < 497 THEN 25
                    WHEN @Level = 65 AND @Total < 502 THEN 30
                    ELSE 0
                  END
    
    IF @NewPoint <> 0 
    BEGIN
      SELECT 'DO SOMETHING'
    END
    
    • SQL Fiddle Demo
    0 讨论(0)
提交回复
热议问题