存储过程不起作用,具体取决于传递的参数值

时间:2014-03-10 13:23:47

标签: sql sql-server stored-procedures

我有SP来更新我的数据库中的数据.. 我的存储过程如下:

ALTER PROCEDURE [dbo].[updatesms] @KodeTingkat INT,
        @KodeKel INT,
        @KodeTPS INT,
        @SuaraPartai INT,
        @KodeCaleg1 INT = -1,
        @SuaraCaleg1 INT = -1,
        @KodeCaleg2 INT = -1,
        @SuaraCaleg2 INT = -1,
        @KodeCaleg3 INT = -1,
        @SuaraCaleg3 INT = -1,
        @KodeCaleg4 INT = -1,
        @SuaraCaleg4 INT = -1,
        @KodeCaleg5 INT = -1,
        @SuaraCaleg5 INT = -1,
        @KodeCaleg6 INT = -1,
        @SuaraCaleg6 INT = -1,
        @KodeCaleg7 INT = -1,
        @SuaraCaleg7 INT = -1,
        @KodeCaleg8 INT = -1,
        @SuaraCaleg8 INT = -1,
        @KodeCaleg9 INT = -1,
        @SuaraCaleg9 INT = -1,
        @KodeCaleg10 INT = -1,
        @SuaraCaleg10 INT = -1,
        @KodeCaleg11 INT = -1,
        @SuaraCaleg11 INT = -1
AS
    BEGIN
        SET NOCOUNT ON;
        SELECT Id
            FROM Kelurahans
            WHERE Kelurahan_Tingkatan = @KodeTingkat

        UPDATE TPSSet 
            SET SuaraPartai=@SuaraPartai
            WHERE TPS_Kelurahan = @KodeKel 
                AND TPSS = @KodeTPS

        IF @KodeCaleg1 > 0
            BEGIN
                SELECT Id
                    FROM Kelurahans
                    WHERE Kelurahan_Tingkatan = @KodeTingkat
                UPDATE Calegs
                    SET JumlahPerolehan = @SuaraCaleg1
                    WHERE Code = @KodeCaleg1
                        AND Caleg_TPS IN (
                            SELECT id 
                            FROM TPSSet
                            WHERE TPS_Kelurahan = @KodeKel AND TPSS = @KodeTPS )
            END

        IF @KodeCaleg2 > 0
            BEGIN
                SELECT Id
                    FROM Kelurahans
                    WHERE Kelurahan_Tingkatan = @KodeTingkat
                UPDATE Calegs
                    SET JumlahPerolehan=@SuaraCaleg2
                    WHERE Code = @KodeCaleg2
                        AND Caleg_TPS IN (
                            SELECT id FROM TPSSet
                            WHERE TPS_Kelurahan = @KodeKel AND TPSS = @KodeTPS )
            END

        IF @KodeCaleg3 > 0
            BEGIN
                SELECT Id
                    FROM Kelurahans
                    WHERE Kelurahan_Tingkatan = @KodeTingkat
                UPDATE Calegs
                    SET JumlahPerolehan=@SuaraCaleg3
                    WHERE Code = @KodeCaleg3
                        AND Caleg_TPS IN (
                            SELECT id FROM TPSSet
                            WHERE TPS_Kelurahan = @KodeKel AND TPSS = @KodeTPS )
            END

        IF @KodeCaleg4 > 0
            BEGIN
                SELECT Id
                    FROM Kelurahans
                    WHERE Kelurahan_Tingkatan = @KodeTingkat
                UPDATE Calegs
                    SET JumlahPerolehan=@SuaraCaleg4
                    WHERE Code = @KodeCaleg4
                        AND Caleg_TPS IN (
                            SELECT id FROM TPSSet
                            WHERE TPS_Kelurahan = @KodeKel AND TPSS = @KodeTPS )
            END

        IF @KodeCaleg5 > 0
            BEGIN
                SELECT Id
                    FROM Kelurahans
                    WHERE Kelurahan_Tingkatan = @KodeTingkat
                UPDATE Calegs
                    SET JumlahPerolehan=@SuaraCaleg5
                    WHERE Code = @KodeCaleg5
                        AND Caleg_TPS IN (
                            SELECT id FROM TPSSet
                            WHERE TPS_Kelurahan = @KodeKel AND TPSS = @KodeTPS )
           END

        IF @KodeCaleg6 > 0
            BEGIN
                SELECT Id
                    FROM Kelurahans
                    WHERE Kelurahan_Tingkatan = @KodeTingkat
                UPDATE Calegs
                    SET JumlahPerolehan=@SuaraCaleg6
                    WHERE Code = @KodeCaleg6
                        AND Caleg_TPS IN (
                            SELECT id FROM TPSSet
                            WHERE TPS_Kelurahan = @KodeKel AND TPSS = @KodeTPS )
            END

        IF @KodeCaleg7 > 0
            BEGIN
                SELECT Id
                    FROM Kelurahans
                    WHERE Kelurahan_Tingkatan = @KodeTingkat
                UPDATE Calegs
                    SET JumlahPerolehan=@SuaraCaleg7
                    WHERE Code = @KodeCaleg7
                        AND Caleg_TPS IN (
                            SELECT id FROM TPSSet
                            WHERE TPS_Kelurahan = @KodeKel AND TPSS = @KodeTPS )
            END

        IF @KodeCaleg8 > 0
            BEGIN
                SELECT Id
                    FROM Kelurahans
                    WHERE Kelurahan_Tingkatan = @KodeTingkat
                UPDATE Calegs
                    SET JumlahPerolehan=@SuaraCaleg8
                    WHERE Code = @KodeCaleg8
                        AND Caleg_TPS IN (
                            SELECT id FROM TPSSet
                            WHERE TPS_Kelurahan = @KodeKel AND TPSS = @KodeTPS )
            END    

        IF @KodeCaleg9 > 0
            BEGIN
                SELECT Id
                    FROM Kelurahans
                    WHERE Kelurahan_Tingkatan = @KodeTingkat
                UPDATE Calegs
                    SET JumlahPerolehan=@SuaraCaleg9
                    WHERE Code = @KodeCaleg9
                        AND Caleg_TPS IN (
                            SELECT id FROM TPSSet
                            WHERE TPS_Kelurahan = @KodeKel AND TPSS = @KodeTPS )
            END

        IF @KodeCaleg10 > 0
            BEGIN
                SELECT Id
                    FROM Kelurahans
                    WHERE Kelurahan_Tingkatan = @KodeTingkat
                UPDATE Calegs
                    SET JumlahPerolehan=@SuaraCaleg10
                    WHERE Code = @KodeCaleg10
                        AND Caleg_TPS IN (
                            SELECT id FROM TPSSet
                            WHERE TPS_Kelurahan = @KodeKel AND TPSS = @KodeTPS )
            END    

        IF @KodeCaleg11 > 0
            BEGIN
                SELECT Id
                    FROM Kelurahans
                    WHERE Kelurahan_Tingkatan = @KodeTingkat
                UPDATE Calegs
                    SET JumlahPerolehan=@SuaraCaleg11
                    WHERE Code = @KodeCaleg11
                        AND Caleg_TPS IN (
                            SELECT id FROM TPSSet
                            WHERE TPS_Kelurahan = @KodeKel AND TPSS = @KodeTPS )
            END            
    END

我的问题: 如果SET @ KodeTingkat = 1存储过程正在努力更新SuaraPartai,@ SuaraCaleg1,@ SuaraCaleg2直到@ SuaraCaleg11

如果SET @ KodeTingkat = 2或SET @ KodeTingkat = 3,则存储过程无法更新以上.. 所以,请帮忙..

我使用此命令调用函数存储过程更新:

BEGIN TRANSACTION 
EXEC updatesms 1,1,1,300,1,80,2,30,3,70,4,50,5,60,6,50,7,25,8,800 
COMMIT 

描述:

  1. 第一个字母的数字1 ..所以,当我把数字1放在第一个字符上时,自动输入代码= 1表tingkatans
  2. 第二个字母的数字1 ..它将自动选择表1 kelurahans中的代码
  3. 第三个字母上的数字1 ..当代码= 1 tingkatans表和代码= 1表中选择的kelurahans和代码= 1 TPSSet表时,它将自动续订/更新SuaraPartai denganjumlah 300 on letters 4
  4. 在第五个字母上的数字1,意味着我在表格Calegs
  5. 中选择代码= 1
  6. 字母上的数字80到六,意味着我做了更新JumlahPerolehan = 80,代码= 1表Calegs
  7. 与第五点相同
  8. 这是我的架构关系:

    http://imgur.com/mKAwD1x


    更新:

    使用下面答案中的代码来测试存储过程外的执行... 像这样开头的代码:

    ------    ALTER PROCEDURE [dbo].[updatesms]
    
    DECLARE
            @KodeTingkat INT,
            @KodeKel INT,
            @KodeTPS INT,
            @SuaraPartai INT,
            @KodeCaleg1 INT = -1,
            @SuaraCaleg1 INT = -1,
            @KodeCaleg2 INT = -1,
            @SuaraCaleg2 INT = -1,
            @KodeCaleg3 INT = -1,
            @SuaraCaleg3 INT = -1,
            @KodeCaleg4 INT = -1,
            @SuaraCaleg4 INT = -1,
            @KodeCaleg5 INT = -1,
            @SuaraCaleg5 INT = -1,
            @KodeCaleg6 INT = -1,
            @SuaraCaleg6 INT = -1,
            @KodeCaleg7 INT = -1,
            @SuaraCaleg7 INT = -1,
            @KodeCaleg8 INT = -1,
            @SuaraCaleg8 INT = -1,
            @KodeCaleg9 INT = -1,
            @SuaraCaleg9 INT = -1,
            @KodeCaleg10 INT = -1,
            @SuaraCaleg10 INT = -1,
            @KodeCaleg11 INT = -1,
            @SuaraCaleg11 INT = -1
    
    ------        AS
    
    
    SET @KodeTingkat=1 
    ----SET @KodeTingkat=2 
    ----SET @KodeTingkat=3 
    
    SET @KodeKel=1
    SET @KodeTPS=1
    SET @SuaraPartai=300
    SET @KodeCaleg1=1
    SET @SuaraCaleg1=80
    SET @KodeCaleg2=2
    SET @SuaraCaleg2=30
    SET @KodeCaleg3=3
    SET @SuaraCaleg3=70
    SET @KodeCaleg4=4
    SET @SuaraCaleg4=50
    SET @KodeCaleg5=5
    SET @SuaraCaleg5=60
    SET @KodeCaleg6=6
    SET @SuaraCaleg6=50
    SET @KodeCaleg7=7
    SET @SuaraCaleg7=25
    SET @KodeCaleg8=8
    SET @SuaraCaleg8=800 
    
    BEGIN
            SET NOCOUNT ON;
            -- suara partai
            DECLARE @Kelurahans_ID INT
    
            SELECT @Kelurahans_ID = Id
            FROM Kelurahans
            WHERE Kelurahan_Tingkatan = @KodeTingkat
            ;
            PRINT 'A)  @Kelurahans_ID is set to ' + STR(@Kelurahans_ID) + ', reading ' + STR(@@rowcount) + ' rows.'
    
            UPDATE TPSSet SET SuaraPartai=@SuaraPartai
            WHERE TPS_Kelurahan = @KodeKel AND TPSS = @KodeTPS
            ;
            PRINT 'B)  SuaraPartai is set to ' + STR(@SuaraPartai) + ', reading ' + STR(@@rowcount) + ' rows.'
    
            -- suara caleg 1
            IF @KodeCaleg1 > 0
            BEGIN
                    PRINT 'C)  Just before update of Calegs, for Code=@KodeCaleg1, which = ' + STR(@KodeCaleg1) 
                    ;
                    UPDATE Calegs
                    SET JumlahPerolehan=@SuaraCaleg1
                    WHERE Code = @KodeCaleg1
                    AND Caleg_TPS IN (
                            SELECT id FROM TPSSet
                            WHERE TPS_Kelurahan = @KodeKel AND TPSS = @KodeTPS AND [TPSSet].[TPS_Kelurahan] = @Kelurahans_ID
                    )
                    ;
                    PRINT 'D)  Updated Calegs for Code=@KodeCaleg1, which = ' + STR(@KodeCaleg1) + '; processing ' + STR(@@rowcount) + ' rows.'
            END
            -- suara caleg 2
    .
    .
    .           
    


    使用该代码,这里是示例输出,如果我设置@KodeTingkat = 1

    • A)@Kelurahans_ID设置为1,读取1行。
    • B)SuaraPartai设置为300,读取1行。
    • C)在更新Calegs之前,Code = @ KodeCaleg1,= 1
    • D)代码的更新Calegs = @ KodeCaleg1,其中= 1; 处理1行。
    • E)在更新Calegs之前,Code = @ KodeCaleg2,= 2
    • F)代码的更新Calegs = @ KodeCaleg2,其中= 2; 处理1行。
    • G)在更新Calegs之前,Code = @ KodeCaleg3,= 3
    • H)为代码更新了Calegs = @ KodeCaleg3,其中= 3; 处理1行。
    • I)在更新Calegs之前,Code = @ KodeCaleg4,= 4
    • J)为代码更新了Calegs = @ KodeCaleg4,其中= 4; 处理1行。
    • K)在更新Calegs之前,Code = @ KodeCaleg5,= 5
    • L)代码更新的Calegs = @ KodeCaleg5,其中= 5; 处理1行。
    • M)在更新Calegs之前,Code = @ KodeCaleg6,其中= 6
    • N)为代码更新了Calegs = @ KodeCaleg6,其中= 6; 处理1行。
    • O)在更新Calegs之前,Code = @ KodeCaleg7,其中= 7
    • P)代码的更新Calegs = @ KodeCaleg7,其中= 7; 处理1行。
    • 问)在更新Calegs之前,Code = @ KodeCaleg8,其中= 8
    • R)代码更新的Calegs = @ KodeCaleg8,其中= 8; 处理1行。
    • S)在更新Calegs之前,Code = @ KodeCaleg9,其中= 9
    • T)代码= @ KodeCaleg9的更新Calegs,其中= 9; 处理1行。
    • U)在更新Calegs之前,Code = @ KodeCaleg10,其中= 10
    • V)代码的更新Calegs = @ KodeCaleg10,其中= 10; 处理1行。
    • W)在更新Calegs之前,Code = @ KodeCaleg11,其中= 11
    • X)更新了Calegs for Code = @ KodeCaleg11,其中= 11; 处理1行。
    • 受影响的行:0
    • 时间:0.097s

    (注意:重复...processing 1 rows

    因此,在@KodeTingkat = 1的情况下,代码更新行......

    现在这里是示例输出,如果我设置@KodeTingkat = 2

    • A)@Kelurahans_ID设置为2,读取1行。
    • B)SuaraPartai设置为200,读取1行。
    • C)在更新Calegs之前,Code = @ KodeCaleg1,= 1
    • D)代码的更新Calegs = @ KodeCaleg1,其中= 1; 处理0行。
    • E)在更新Calegs之前,Code = @ KodeCaleg2,= 2
    • F)代码的更新Calegs = @ KodeCaleg2,其中= 2; 处理0行。
    • G)在更新Calegs之前,Code = @ KodeCaleg3,= 3
    • H)为代码更新了Calegs = @ KodeCaleg3,其中= 3; 处理0行。
    • I)在更新Calegs之前,Code = @ KodeCaleg4,= 4
    • J)为代码更新了Calegs = @ KodeCaleg4,其中= 4; 处理0行。
    • K)在更新Calegs之前,Code = @ KodeCaleg5,= 5
    • L)代码更新的Calegs = @ KodeCaleg5,其中= 5; 处理0行。
    • M)在更新Calegs之前,Code = @ KodeCaleg6,其中= 6
    • N)为代码更新了Calegs = @ KodeCaleg6,其中= 6; 处理0行。
    • O)在更新Calegs之前,Code = @ KodeCaleg7,其中= 7
    • P)代码的更新Calegs = @ KodeCaleg7,其中= 7; 处理0行。
    • 问)在更新Calegs之前,Code = @ KodeCaleg8,其中= 8
    • R)代码更新的Calegs = @ KodeCaleg8,其中= 8; 处理0行。
    • S)在更新Calegs之前,Code = @ KodeCaleg9,其中= 9
    • T)代码= @ KodeCaleg9的更新Calegs,其中= 9; 处理0行。
    • U)在更新Calegs之前,Code = @ KodeCaleg10,其中= 10
    • V)代码的更新Calegs = @ KodeCaleg10,其中= 10; 处理0行。
    • W)在更新Calegs之前,Code = @ KodeCaleg11,其中= 11
    • X)更新了Calegs for Code = @ KodeCaleg11,其中= 11; 处理0行。
    • 受影响的行:0
    • 时间:0.054秒

    (注意:...processing 0 rows重复)

    因此,在@KodeTingkat = 2的情况下,代码更新行...

    为什么吗

1 个答案:

答案 0 :(得分:0)