【问题标题】:Stored Procedure Throwing Error But Updating Record存储过程抛出错误但更新记录
【发布时间】:2017-03-24 22:51:36
【问题描述】:

我有一个存储过程,它将根据县代码、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

并且只更新匹配这两个条件的记录。但我看到的是存储过程更新了县的记录,但在存储过程中抛出了 RAISERROR 语句。

例如,这是我目前的记录:

当我运行存储过程时:

我得到以下信息:

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

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

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;

【问题讨论】:

  • 好吧,当然,您首先提出错误,然后运行UPDATE
  • 好的 - 我认为引发错误会阻止更新运行。
  • 那么,您实际上不想更新表格,除非其中一个参数是 null?
  • 否 - 如果参数之一为 NULL,它仍应更新。但是如果提供了这两个参数,我想确保它们与数据库中的现有记录匹配。我将尝试在原始问题中进行澄清。
  • 但是你的RAISERROR 一点意义都没有

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


【解决方案1】:

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

IF (@@ROWCOUNT) < 1

但我看不到您在哪里运行查询以查看提供的参数是否有匹配记录。

我想你会想要运行类似的东西

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

只是一个想法。

【讨论】:

  • 感谢 Paul - 我会将其标记为正确,因为根据您的回答,我能够重写 SQL 以使 proc 按预期工作。
【解决方案2】:

我用来生成正确响应的代码:

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 );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多