SQL 存储过程阻止写入空值 [英] SQL Stored Procedure preventing to write null

查看:27
本文介绍了SQL 存储过程阻止写入空值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以,我在我的一个存储过程中实现了下面的这个.如果他们指定的点数较少,它可以正常工作,但如果他们有正常的点数(不少于)并且它们是例如级别 61 并且总共有 482 点,那么脚本将尝试在总点数上写入 NULL,我想做到这一点,所以它不会这样做,如果他们对积分没意见就什么都不做.(就像脚本从未执行过一样)因为如果它们有足够的点数,那么我们就不必添加它们.

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 they are for example level 61 and with 482 points total then the script will try to write NULL on total Points and I want to make it, so it wont do it and if they are okay with points just to do nothing. (like the script has never been executed) because if they have enough points then we dont have to add them.

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)


IF @Level = 61 AND @Total < 482

BEGIN

SET @NewPoint = 10

END

IF @Level = 62 AND @Total < 487

BEGIN

SET @NewPoint = 15

END

IF @Level = 63 AND @Total < 492

BEGIN

SET @NewPoint = 20

END

IF @Level = 64 AND @Total < 497

BEGIN

SET @NewPoint = 25

END

IF @Level = 65 AND @Total < 502

BEGIN

SET @NewPoint = 30

END

IF @Level = 66 AND @Total < 507

BEGIN

SET @NewPoint = 35

END

IF @Level = 67 AND @Total < 512

BEGIN

SET @NewPoint = 40

END

IF @Level = 68 AND @Total < 517

BEGIN

SET @NewPoint = 45

END

IF @Level = 69 AND @Total < 522

BEGIN

SET @NewPoint = 50

END

IF @Level = 70 AND @Total < 527

BEGIN

SET @NewPoint = 55

END

IF @Level = 71 AND @Total < 532

BEGIN

SET @NewPoint = 60

END

IF @Level = 72 AND @Total < 537

BEGIN

SET @NewPoint = 65

END

IF @Level = 73 AND @Total < 542

BEGIN

SET @NewPoint = 70

END

IF @Level = 74 AND @Total < 547

BEGIN

SET @NewPoint = 75

END

IF @Level = 75 AND @Total < 552

BEGIN

SET @NewPoint = 80

END

IF @Level = 76 AND @Total < 557

BEGIN

SET @NewPoint = 85

END

IF @Level = 77 AND @Total < 562

BEGIN

SET @NewPoint = 90

END

IF @Level = 78 AND @Total < 567

BEGIN

SET @NewPoint = 95

END

IF @Level = 79 AND @Total < 572

BEGIN

SET @NewPoint = 100

END

IF @Level = 80 AND @Total < 577

BEGIN

SET @NewPoint = 105

END

IF @Level = 81 AND @Total < 582

BEGIN

SET @NewPoint = 110

END

IF @Level = 82 AND @Total < 587

BEGIN

SET @NewPoint = 115

END

IF @Level = 83 AND @Total < 592

BEGIN

SET @NewPoint = 120

END



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

推荐答案

切换到带有 ELSE 子句的 CASE 语句.无论如何它更简洁.

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

这篇关于SQL 存储过程阻止写入空值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆