我有一个存储过程,它会根据县代码,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语句。
例如,以下是我目前的记录:
当我运行存储过程时:
我得到以下内容:
以下是存储过程的代码。谁能帮我理解我错在哪里?
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;
答案 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 );