存储过程抛出错误但更新记录

时间:2016-11-10 19:32:13

标签: tsql stored-procedures sql-server-2014

我有一个存储过程,它会根据县代码,URL或两者的组合更新标记。例如,县03可能有这两个记录:

county_code = 03
webservice_type_id = 1
webservice_URL = http://192.168.100.3/A

county_code = 03
webservice_type_id = 2
webservice_URL = http://192.168.100.3/B

如果我想使用我的存储过程启用/禁用该标志,我应该可以运行:

execute dbo.usp_webservice_change_status
@enable = 1
@county_code = '03'
@webserviceURL = http://192.168.100.3/B

并仅更新与两个condidtions匹配的记录。但我所看到的是存储过程更新了县的记录,但是在存储过程中抛出了RAISERROR语句。

例如,以下是我目前的记录:

enter image description here

当我运行存储过程时:

enter image description here

我得到以下内容:

enter image description here

但是当我再次查看记录时,我发现它们已经更新: enter image description here

以下是存储过程的代码。谁能帮我理解我错在哪里?

ALTER PROCEDURE [dbo].[usp_webservice_change_status]
    @enable AS BIT,
    @county_code AS CHAR(2) = NULL,
    @webserviceURL AS VARCHAR(4000) = NULL
AS
BEGIN
    SET NOCOUNT ON;

    IF @enable IS NULL
        RAISERROR ('The value for @enable should not be null', 15, 1);

    IF ( @county_code IS NULL AND @webserviceURL IS NULL )
        RAISERROR ('The value for @county_code and @webserviceURL cannot both be null', 15, 1);

    -- Update for County Code Only
    IF (@county_code IS NOT NULL AND @webserviceURL IS NULL )
        UPDATE dbo.webservice_config
        SET [enable] = @enable,
            comments = CASE
                           WHEN @enable = 1 
                              THEN 'Enabled by ' + SUSER_SNAME()
                              ELSE 'Disabled by ' + SUSER_SNAME()
                       END
        WHERE county_code = @county_code;

    -- Update for Webservice URL only
    ELSE IF ( @county_code IS NULL AND @webserviceURL IS NOT NULL )
        UPDATE dbo.webservice_config
        SET [enable] = @enable,
            comments = CASE
                          WHEN @enable = 1 
                             THEN 'Enabled by ' + SUSER_SNAME()
                             ELSE 'Disabled by ' + SUSER_SNAME()
                       END    
        WHERE webservice_URL = @webserviceURL;

    -- Update for both County Code and Webservice URL - but only if the records match
    ELSE IF (@county_code IS NOT NULL AND @webserviceURL IS NOT NULL )
        IF (@@ROWCOUNT) < 1
            RAISERROR('Nothing Updated Due to Non Matching Records', 15, 1);

        UPDATE dbo.webservice_config
        SET [enable] = @enable,
            comments = CASE
                          WHEN @enable = 1 
                             THEN 'Enabled by ' + SUSER_SNAME()
                             ELSE 'Disabled by ' + SUSER_SNAME()
                       END
        WHERE (county_code = @county_code 
               AND webservice_URL = @webserviceURL);
END;

2 个答案:

答案 0 :(得分:1)

在你检查两个参数都不为空的最后一个ELSE IF中,你使用下一行

IF (@@ROWCOUNT) < 1

但是我不知道你在哪里运行查询,看看是否有匹配的记录提供的参数。

我认为你想要运行类似

的东西
IF(SELECT count(1) FROM dbo.webservice_config) <> 1
  RAISEERROR
ELSE
  Do your update

只是一个想法。

答案 1 :(得分:0)

我用来生成正确答案的代码:

ALTER PROCEDURE [dbo].[usp_webservice_change_status]
@enable AS BIT,
@county_code AS CHAR(2) = NULL,
@webserviceURL AS VARCHAR(4000) = NULL
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Count INT = ( SELECT COUNT(1) FROM dbo.webservice_config WHERE county_code = @county_code AND webservice_URL = @webserviceURL );

....

ELSE IF ( @county_code IS NOT NULL AND @webserviceURL IS NOT NULL )
         IF @Count > 0
             UPDATE dbo.webservice_config
             SET [enable] = @enable,
                 comments = CASE
                                WHEN @enable = 1 THEN 'Enabled by ' + SUSER_SNAME()
                                ELSE 'Disabled by ' + SUSER_SNAME()
                            END
             WHERE ( county_code = @county_code AND webservice_URL = @webserviceURL );

         ELSE
             RAISERROR ('Nothing Updated Due to Non Matching Records', 15, 1 );